Support TQ_FRONT flag used by taskq_dispatch()

Allow taskq_dispatch() to insert work items at the head of the
queue instead of just the tail by passing the TQ_FRONT flag.
This commit is contained in:
Brian Behlendorf 2010-06-11 14:53:23 -07:00
parent 32c6147dee
commit eb12b3782c
2 changed files with 9 additions and 1 deletions

View File

@ -39,6 +39,7 @@
#define TASKQ_CPR_SAFE 0x00000002 #define TASKQ_CPR_SAFE 0x00000002
#define TASKQ_DYNAMIC 0x00000004 #define TASKQ_DYNAMIC 0x00000004
#define TASKQ_THREADS_CPU_PCT 0x00000008 #define TASKQ_THREADS_CPU_PCT 0x00000008
#define TASKQ_DC_BATCH 0x00000010
typedef unsigned long taskqid_t; typedef unsigned long taskqid_t;
typedef void (task_func_t)(void *); typedef void (task_func_t)(void *);
@ -53,6 +54,7 @@ typedef void (task_func_t)(void *);
#define TQ_NOQUEUE 0x01000000 #define TQ_NOQUEUE 0x01000000
#define TQ_NOALLOC 0x02000000 #define TQ_NOALLOC 0x02000000
#define TQ_NEW 0x04000000 #define TQ_NEW 0x04000000
#define TQ_FRONT 0x08000000
#define TQ_ACTIVE 0x80000000 #define TQ_ACTIVE 0x80000000
typedef struct taskq { typedef struct taskq {

View File

@ -274,7 +274,13 @@ __taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t flags)
GOTO(out, rc = 0); GOTO(out, rc = 0);
spin_lock(&t->t_lock); spin_lock(&t->t_lock);
/* Queue to the head instead of the tail */
if (flags & TQ_FRONT)
list_add(&t->t_list, &tq->tq_pend_list);
else
list_add_tail(&t->t_list, &tq->tq_pend_list); list_add_tail(&t->t_list, &tq->tq_pend_list);
t->t_id = rc = tq->tq_next_id; t->t_id = rc = tq->tq_next_id;
tq->tq_next_id++; tq->tq_next_id++;
t->t_func = func; t->t_func = func;