diff options
author | Lai Jiangshan <laijs@cn.fujitsu.com> | 2014-07-22 13:01:59 +0800 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2014-07-22 10:37:52 -0400 |
commit | a489a03eca74cd1d5ac771f4b2ae2c826aab0b30 (patch) | |
tree | 7ac69e996945da543012d86bc2efe66cb5c082a2 /kernel/workqueue.c | |
parent | d8ca83e68c8c7efd8e5920a046d5c576b08609f0 (diff) | |
download | lwn-a489a03eca74cd1d5ac771f4b2ae2c826aab0b30.tar.gz lwn-a489a03eca74cd1d5ac771f4b2ae2c826aab0b30.zip |
workqueue: remove an unneeded UNBOUND test before waking up the next worker
In process_one_work():
if ((worker->flags & WORKER_UNBOUND) && need_more_worker(pool))
wake_up_worker(pool);
the first test is unneeded. Even if the first test is removed, it
doesn't affect the wake-up logic for WORKER_UNBOUND, and it will not
introduce any useless wake-ups for normal per-cpu workers since
nr_running is always >= 1. It will introduce useless/redundant
wake-ups for CPU_INTENSIVE, but this case is rare and the next patch
will also remove this redundant wake-up.
tj: Minor updates to the description and comment.
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 | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index d3444169e261..c20cfbe89194 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -2048,10 +2048,13 @@ __acquires(&pool->lock) worker_set_flags(worker, WORKER_CPU_INTENSIVE, true); /* - * Unbound pool isn't concurrency managed and work items should be - * executed ASAP. Wake up another worker if necessary. + * Wake up another worker if necessary. The condition is always + * false for normal per-cpu workers since nr_running would always + * be >= 1 at this point. This is used to chain execution of the + * pending work items for WORKER_NOT_RUNNING workers such as the + * UNBOUND ones. */ - if ((worker->flags & WORKER_UNBOUND) && need_more_worker(pool)) + if (need_more_worker(pool)) wake_up_worker(pool); /* |