diff options
author | Lai Jiangshan <laijs@cn.fujitsu.com> | 2014-06-03 09:32:07 +0200 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2014-06-19 18:24:40 +0200 |
commit | e6a9a7712331b9d2f551cad8630f6a6c6428c721 (patch) | |
tree | 6cb4d8afd070d1300601596163c3cfbfcc638bd6 /kernel/workqueue.c | |
parent | workqueue: use "pool->cpu < 0" to stand for an unbound pool (diff) | |
download | linux-e6a9a7712331b9d2f551cad8630f6a6c6428c721.tar.xz linux-e6a9a7712331b9d2f551cad8630f6a6c6428c721.zip |
workqueue: remove the empty check in too_many_workers()
The commit ea1abd6197d5 ("workqueue: reimplement idle worker rebinding")
used a trick which simply removes all to-be-bound idle workers from the
idle list and lets them add themselves back after completing rebinding.
And this trick caused the @worker_pool->nr_idle may deviate than the actual
number of idle workers on @worker_pool->idle_list. More specifically,
nr_idle may be non-zero while ->idle_list is empty. All users of
->nr_idle and ->idle_list are audited. The only affected one is
too_many_workers() which is updated to check %false if ->idle_list is
empty regardless of ->nr_idle.
The commit/trick was complicated due to it just tried to simplify an even
more complicated problem (workers had to rebind itself). But the commit
a9ab775bcadf ("workqueue: directly restore CPU affinity of workers
from CPU_ONLINE") fixed all these problems and the mentioned trick was
useless and is gone.
So, now the @worker_pool->nr_idle is exactly the actual number of workers
on @worker_pool->idle_list. too_many_workers() should recover as it was
before the trick. So we remove the empty check.
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/workqueue.c')
-rw-r--r-- | kernel/workqueue.c | 7 |
1 files changed, 0 insertions, 7 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index ea2c5de502aa..170b724b2d69 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -758,13 +758,6 @@ static bool too_many_workers(struct worker_pool *pool) int nr_idle = pool->nr_idle + managing; /* manager is considered idle */ int nr_busy = pool->nr_workers - nr_idle; - /* - * nr_idle and idle_list may disagree if idle rebinding is in - * progress. Never return %true if idle_list is empty. - */ - if (list_empty(&pool->idle_list)) - return false; - return nr_idle > 2 && (nr_idle - 2) * MAX_IDLE_WORKERS_RATIO >= nr_busy; } |