gtask
TASK_INIT(&fc->gtask, 1, isp_gdt_task, fc);
taskqueue_enqueue(taskqueue_swi, &fc->gtask);
struct task gtask;
struct gtask *gtask = &grouptask->gt_task;
gtask_dump(gtask);
gtask->ta_flags |= TASK_NOENQUEUE;
gtaskqueue_drain_locked(queue, gtask);
struct gtask *gtask = &grouptask->gt_task;
gtask_dump(gtask);
gtask->ta_flags &= ~TASK_NOENQUEUE;
grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *gtask)
gtask_dump(gtask);
if (gtask->ta_flags & TASK_ENQUEUED) {
if (gtask->ta_flags & TASK_NOENQUEUE) {
STAILQ_INSERT_TAIL(&queue->tq_queue, gtask, ta_link);
gtask->ta_flags |= TASK_ENQUEUED;
struct gtask t_barrier;
struct gtask *gtask;
while ((gtask = STAILQ_FIRST(&queue->tq_queue)) != NULL) {
gtask->ta_flags &= ~TASK_ENQUEUED;
tb.tb_running = gtask;
KASSERT(gtask->ta_func != NULL, ("task->ta_func is NULL"));
if (!in_net_epoch && TASK_IS_NET(gtask)) {
} else if (in_net_epoch && !TASK_IS_NET(gtask)) {
gtask->ta_func(gtask->ta_context);
wakeup(gtask);
task_is_running(struct gtaskqueue *queue, struct gtask *gtask)
if (tb->tb_running == gtask)
gtaskqueue_cancel_locked(struct gtaskqueue *queue, struct gtask *gtask)
if (gtask->ta_flags & TASK_ENQUEUED)
STAILQ_REMOVE(&queue->tq_queue, gtask, gtask, ta_link);
gtask->ta_flags &= ~TASK_ENQUEUED;
return (task_is_running(queue, gtask) ? EBUSY : 0);
gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask)
error = gtaskqueue_cancel_locked(queue, gtask);
gtaskqueue_drain_locked(struct gtaskqueue *queue, struct gtask *gtask)
while ((gtask->ta_flags & TASK_ENQUEUED) || task_is_running(queue, gtask))
TQ_SLEEP(queue, gtask, "gtq_drain");
gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *gtask)
gtaskqueue_drain_locked(queue, gtask);
static int task_is_running(struct gtaskqueue *queue, struct gtask *gtask);
static void gtaskqueue_drain_locked(struct gtaskqueue *queue, struct gtask *gtask);
struct gtask *tb_running;
struct gtask bt_task;
STAILQ_HEAD(, gtask) tq_queue;
taskqgroup_attach(struct taskqgroup *qgroup, struct grouptask *gtask,
gtask->gt_uniq = uniq;
ksnprintf(gtask->gt_name, GROUPTASK_NAMELEN, "%s", name ? name : "grouptask");
gtask->gt_dev = dev;
gtask->gt_irq = irq;
gtask->gt_cpu = -1;
LIST_INSERT_HEAD(&qgroup->tqg_queue[qid].tgc_tasks, gtask, gt_list);
gtask->gt_taskqueue = qgroup->tqg_queue[qid].tgc_taskq;
gtask->gt_cpu = cpu;
__func__, gtask->gt_name, error);
taskqgroup_attach_cpu(struct taskqgroup *qgroup, struct grouptask *gtask,
gtask->gt_uniq = uniq;
ksnprintf(gtask->gt_name, GROUPTASK_NAMELEN, "%s", name ? name : "grouptask");
gtask->gt_dev = dev;
gtask->gt_irq = irq;
gtask->gt_cpu = cpu;
__func__, gtask->gt_name, cpu);
LIST_INSERT_HEAD(&qgroup->tqg_queue[qid].tgc_tasks, gtask, gt_list);
gtask->gt_taskqueue = qgroup->tqg_queue[qid].tgc_taskq;
__func__, gtask->gt_name, error);
taskqgroup_detach(struct taskqgroup *qgroup, struct grouptask *gtask)
grouptask_block(gtask);
if (qgroup->tqg_queue[i].tgc_taskq == gtask->gt_taskqueue)
panic("%s: task %s not in group", __func__, gtask->gt_name);
LIST_REMOVE(gtask, gt_list);
gtask->gt_taskqueue = NULL;
gtask->gt_task.ta_flags &= ~TASK_NOENQUEUE;
struct taskq_bind_task *gtask;
gtask = ctx;
lwkt_migratecpu(gtask->bt_cpuid);
kfree(gtask, M_DEVBUF);
struct taskq_bind_task *gtask;
gtask = kmalloc(sizeof(*gtask), M_DEVBUF, M_WAITOK);
GTASK_INIT(>ask->bt_task, 0, 0, taskqgroup_binder, gtask);
gtask->bt_cpuid = qgroup->tqg_queue[i].tgc_cpu;
>ask->bt_task);
gtask_dump(struct gtask *gtask)
gtask, gtask->ta_flags, gtask->ta_priority,
gtask->ta_func, gtask->ta_context);
#define GTASK_INIT(gtask, flags, priority, func, context) do { \
(gtask)->ta_flags = (flags); \
(gtask)->ta_priority = (priority); \
(gtask)->ta_func = (func); \
(gtask)->ta_context = (context); \
#define GROUPTASK_INIT(gtask, priority, func, context) \
GTASK_INIT(&(gtask)->gt_task, 0, priority, func, context)
#define GROUPTASK_ENQUEUE(gtask) \
grouptaskqueue_enqueue((gtask)->gt_taskqueue, &(gtask)->gt_task)
STAILQ_ENTRY(gtask) ta_link; /* (q) link for queue */
struct gtask gt_task;
int gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask);
void gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *task);
int grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *task);
void taskqgroup_detach(struct taskqgroup *qgroup, struct grouptask *gtask);