Lines Matching defs:gtask

60 static int	task_is_running(struct gtaskqueue *queue, struct gtask *gtask);
61 static void gtaskqueue_drain_locked(struct gtaskqueue *queue, struct gtask *gtask);
67 struct gtask *tb_running;
71 static struct gtask * const TB_DRAIN_WAITER = (struct gtask *)0x1;
76 STAILQ_HEAD(, gtask) tq_queue;
117 gtask_dump(struct gtask *gtask)
119 printf("gtask: %p ta_flags=%x ta_priority=%d ta_func=%p ta_context=%p\n",
120 gtask, gtask->ta_flags, gtask->ta_priority, gtask->ta_func, gtask->ta_context);
203 struct gtask *gtask = &grouptask->gt_task;
207 gtask_dump(gtask);
212 gtask->ta_flags |= TASK_NOENQUEUE;
213 gtaskqueue_drain_locked(queue, gtask);
221 struct gtask *gtask = &grouptask->gt_task;
225 gtask_dump(gtask);
230 gtask->ta_flags &= ~TASK_NOENQUEUE;
235 grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *gtask)
239 gtask_dump(gtask);
244 if (gtask->ta_flags & TASK_ENQUEUED) {
248 if (gtask->ta_flags & TASK_NOENQUEUE) {
252 STAILQ_INSERT_TAIL(&queue->tq_queue, gtask, ta_link);
253 gtask->ta_flags |= TASK_ENQUEUED;
273 struct gtask t_barrier;
363 struct gtask *gtask;
376 gtask = STAILQ_FIRST(&queue->tq_queue);
377 KASSERT(gtask != NULL, ("task is NULL"));
379 gtask->ta_flags &= ~TASK_ENQUEUED;
380 tb.tb_running = gtask;
383 KASSERT(gtask->ta_func != NULL, ("task->ta_func is NULL"));
384 gtask->ta_func(gtask->ta_context);
388 wakeup(gtask);
399 task_is_running(struct gtaskqueue *queue, struct gtask *gtask)
405 if (tb->tb_running == gtask)
412 gtaskqueue_cancel_locked(struct gtaskqueue *queue, struct gtask *gtask)
415 if (gtask->ta_flags & TASK_ENQUEUED)
416 STAILQ_REMOVE(&queue->tq_queue, gtask, gtask, ta_link);
417 gtask->ta_flags &= ~TASK_ENQUEUED;
418 return (task_is_running(queue, gtask) ? EBUSY : 0);
422 gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask)
427 error = gtaskqueue_cancel_locked(queue, gtask);
434 gtaskqueue_drain_locked(struct gtaskqueue *queue, struct gtask *gtask)
436 while ((gtask->ta_flags & TASK_ENQUEUED) || task_is_running(queue, gtask))
437 TQ_SLEEP(queue, gtask, &queue->tq_mutex, PWAIT, "-", 0);
441 gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *gtask)
449 gtaskqueue_drain_locked(queue, gtask);
633 struct gtask bt_task;
733 taskqgroup_attach(struct taskqgroup *qgroup, struct grouptask *gtask,
738 gtask->gt_uniq = uniq;
739 snprintf(gtask->gt_name, GROUPTASK_NAMELEN, "%s", name ? name : "grouptask");
740 gtask->gt_dev = dev;
741 gtask->gt_irq = irq;
742 gtask->gt_cpu = -1;
746 LIST_INSERT_HEAD(&qgroup->tqg_queue[qid].tgc_tasks, gtask, gt_list);
747 gtask->gt_taskqueue = qgroup->tqg_queue[qid].tgc_taskq;
750 gtask->gt_cpu = cpu;
755 __func__, gtask->gt_name, error);
761 taskqgroup_attach_deferred(struct taskqgroup *qgroup, struct grouptask *gtask)
766 qid = taskqgroup_find(qgroup, gtask->gt_uniq);
768 if (gtask->gt_dev != NULL && gtask->gt_irq != NULL) {
770 error = bus_bind_intr(gtask->gt_dev, gtask->gt_irq, cpu);
774 __func__, gtask->gt_name, error);
778 LIST_INSERT_HEAD(&qgroup->tqg_queue[qid].tgc_tasks, gtask, gt_list);
780 gtask->gt_taskqueue = qgroup->tqg_queue[qid].tgc_taskq;
785 taskqgroup_attach_cpu(struct taskqgroup *qgroup, struct grouptask *gtask,
791 gtask->gt_uniq = uniq;
792 snprintf(gtask->gt_name, GROUPTASK_NAMELEN, "%s", name ? name : "grouptask");
793 gtask->gt_dev = dev;
794 gtask->gt_irq = irq;
795 gtask->gt_cpu = cpu;
805 printf("%s: qid not found for %s cpu=%d\n", __func__, gtask->gt_name, cpu);
811 LIST_INSERT_HEAD(&qgroup->tqg_queue[qid].tgc_tasks, gtask, gt_list);
812 gtask->gt_taskqueue = qgroup->tqg_queue[qid].tgc_taskq;
820 __func__, gtask->gt_name, error);
826 taskqgroup_attach_cpu_deferred(struct taskqgroup *qgroup, struct grouptask *gtask)
833 dev = gtask->gt_dev;
834 irq = gtask->gt_irq;
835 cpu = gtask->gt_cpu;
845 printf("%s: qid not found for %s cpu=%d\n", __func__, gtask->gt_name, cpu);
849 LIST_INSERT_HEAD(&qgroup->tqg_queue[qid].tgc_tasks, gtask, gt_list);
851 gtask->gt_taskqueue = qgroup->tqg_queue[qid].tgc_taskq;
858 __func__, gtask->gt_name, error);
864 taskqgroup_detach(struct taskqgroup *qgroup, struct grouptask *gtask)
868 grouptask_block(gtask);
871 if (qgroup->tqg_queue[i].tgc_taskq == gtask->gt_taskqueue)
874 panic("%s: task %s not in group", __func__, gtask->gt_name);
876 LIST_REMOVE(gtask, gt_list);
878 gtask->gt_taskqueue = NULL;
879 gtask->gt_task.ta_flags &= ~TASK_NOENQUEUE;
885 struct taskq_bind_task *gtask = (struct taskq_bind_task *)ctx;
891 CPU_SET(gtask->bt_cpuid, &mask);
894 sched_bind(curthread, gtask->bt_cpuid);
900 free(gtask, M_DEVBUF);
906 struct taskq_bind_task *gtask;
917 gtask = malloc(sizeof (*gtask), M_DEVBUF, M_WAITOK);
918 GTASK_INIT(&gtask->bt_task, 0, 0, taskqgroup_binder, gtask);
919 gtask->bt_cpuid = qgroup->tqg_queue[i].tgc_cpu;
921 &gtask->bt_task);
947 struct grouptask *gtask;
995 while ((gtask = LIST_FIRST(&qgroup->tqg_queue[i].tgc_tasks))) {
996 LIST_REMOVE(gtask, gt_list);
998 LIST_INSERT_HEAD(&gtask_head, gtask, gt_list);
1003 while ((gtask = LIST_FIRST(&gtask_head))) {
1004 LIST_REMOVE(gtask, gt_list);
1005 if (gtask->gt_cpu == -1)
1006 taskqgroup_attach_deferred(qgroup, gtask);
1007 else if (taskqgroup_attach_cpu_deferred(qgroup, gtask))
1008 taskqgroup_attach_deferred(qgroup, gtask);
1015 LIST_FOREACH(gtask, &qgroup->tqg_queue[i].tgc_tasks, gt_list)
1016 MPASS(gtask->gt_taskqueue != NULL);
1066 taskqgroup_config_gtask_init(void *ctx, struct grouptask *gtask, gtask_fn_t *fn,
1070 GROUPTASK_INIT(gtask, 0, fn, ctx);
1071 taskqgroup_attach(qgroup_config, gtask, gtask, NULL, NULL, name);
1075 taskqgroup_config_gtask_deinit(struct grouptask *gtask)
1078 taskqgroup_detach(qgroup_config, gtask);