aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2010-07-02 10:03:51 +0200
committerTejun Heo <tj@kernel.org>2010-07-02 10:03:51 +0200
commitd313dd85ad846bc768d58e9ceb28588f917f4c9a (patch)
treeb61b92f270b9fedc577e8196d605c93d695052d4
parenta1e453d2799760ecf2e09ecd45b80edbe7ff540e (diff)
downloadkernel_samsung_smdk4412-d313dd85ad846bc768d58e9ceb28588f917f4c9a.zip
kernel_samsung_smdk4412-d313dd85ad846bc768d58e9ceb28588f917f4c9a.tar.gz
kernel_samsung_smdk4412-d313dd85ad846bc768d58e9ceb28588f917f4c9a.tar.bz2
workqueue: fix worker management invocation without pending works
When there's no pending work to do, worker_thread() goes back to sleep after waking up without checking whether worker management is necessary. This means that idle worker exit requests can be ignored if the gcwq stays empty. Fix it by making worker_thread() always check whether worker management is necessary before going to sleep. Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--kernel/workqueue.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 0c485a5..2eb9fbd 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -1832,10 +1832,10 @@ recheck:
} while (keep_working(gcwq));
worker_set_flags(worker, WORKER_PREP, false);
-
+sleep:
if (unlikely(need_to_manage_workers(gcwq)) && manage_workers(worker))
goto recheck;
-sleep:
+
/*
* gcwq->lock is held and there's no work to process and no
* need to manage, sleep. Workers are woken up only while