--- //depot/vendor/freebsd/src/sys/kern/subr_taskqueue.c 2003/12/17 13:15:30 +++ //depot/projects/smpng/sys/kern/subr_taskqueue.c 2003/12/17 13:41:47 @@ -121,12 +121,11 @@ mtx_lock(&taskqueue_queues_mutex); STAILQ_FOREACH(queue, &taskqueue_queues, tq_link) { - mtx_lock(&queue->tq_mutex); if (strcmp(queue->tq_name, name) == 0) { + mtx_lock(&queue->tq_mutex); mtx_unlock(&taskqueue_queues_mutex); return queue; } - mtx_unlock(&queue->tq_mutex); } mtx_unlock(&taskqueue_queues_mutex); return NULL; @@ -235,28 +234,23 @@ } static void -taskqueue_kthread(void *arg) +taskqueue_thread_loop(void *arg) { - struct mtx kthread_mutex; - - bzero(&kthread_mutex, sizeof(kthread_mutex)); - - mtx_init(&kthread_mutex, "taskqueue kthread", NULL, MTX_DEF); - - mtx_lock(&kthread_mutex); - for (;;) { - mtx_unlock(&kthread_mutex); + mtx_lock(&taskqueue_thread->tq_mutex); + while (STAILQ_EMPTY(&taskqueue_thread->tq_queue)) + msleep(taskqueue_thread, &taskqueue_thread->tq_mutex, + PWAIT, "-", 0); + mtx_unlock(&taskqueue_thread->tq_mutex); taskqueue_run(taskqueue_thread); - mtx_lock(&kthread_mutex); - msleep(&taskqueue_thread, &kthread_mutex, PWAIT, "tqthr", 0); } } static void taskqueue_thread_enqueue(void *context) { - wakeup(&taskqueue_thread); + mtx_assert(&taskqueue_thread->tq_mutex, MA_OWNED); + wakeup(taskqueue_thread); } TASKQUEUE_DEFINE(swi, taskqueue_swi_enqueue, 0, @@ -268,7 +262,7 @@ NULL, SWI_TQ_GIANT, 0, &taskqueue_giant_ih)); TASKQUEUE_DEFINE(thread, taskqueue_thread_enqueue, 0, - kthread_create(taskqueue_kthread, NULL, + kthread_create(taskqueue_thread_loop, NULL, &taskqueue_thread_proc, 0, 0, "taskqueue")); int