aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2010-07-02 04:03:51 -0400
committerTejun Heo <tj@kernel.org>2010-07-02 04:03:51 -0400
commitd313dd85ad846bc768d58e9ceb28588f917f4c9a (patch)
treeb61b92f270b9fedc577e8196d605c93d695052d4 /kernel
parenta1e453d2799760ecf2e09ecd45b80edbe7ff540e (diff)
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>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/workqueue.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 0c485a538099..2eb9fbddf5c6 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -1832,10 +1832,10 @@ recheck:
1832 } while (keep_working(gcwq)); 1832 } while (keep_working(gcwq));
1833 1833
1834 worker_set_flags(worker, WORKER_PREP, false); 1834 worker_set_flags(worker, WORKER_PREP, false);
1835 1835sleep:
1836 if (unlikely(need_to_manage_workers(gcwq)) && manage_workers(worker)) 1836 if (unlikely(need_to_manage_workers(gcwq)) && manage_workers(worker))
1837 goto recheck; 1837 goto recheck;
1838sleep: 1838
1839 /* 1839 /*
1840 * gcwq->lock is held and there's no work to process and no 1840 * gcwq->lock is held and there's no work to process and no
1841 * need to manage, sleep. Workers are woken up only while 1841 * need to manage, sleep. Workers are woken up only while