--- 25-akpm/kernel/workqueue.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff -puN kernel/workqueue.c~worker_thread-race-fix kernel/workqueue.c --- 25/kernel/workqueue.c~worker_thread-race-fix Mon May 3 13:02:25 2004 +++ 25-akpm/kernel/workqueue.c Mon May 3 13:07:34 2004 @@ -201,19 +201,20 @@ static int worker_thread(void *__cwq) siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD)); do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0); + set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { - set_task_state(current, TASK_INTERRUPTIBLE); - add_wait_queue(&cwq->more_work, &wait); if (list_empty(&cwq->worklist)) schedule(); else - set_task_state(current, TASK_RUNNING); + __set_current_state(TASK_RUNNING); remove_wait_queue(&cwq->more_work, &wait); if (!list_empty(&cwq->worklist)) run_workqueue(cwq); + set_current_state(TASK_INTERRUPTIBLE); } + __set_current_state(TASK_RUNNING); return 0; } _