History

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.

Lai Jiangshan committed 12 years ago

Commit a489a031 parent d8ca83e1 file · +6 −3Browse files

Showing the changes to kernel/workqueue.c (1 of 1 file). Show all

Unified · Split

kernel/workqueue.c+6−3
@@ -2048,10 +2048,13 @@ __acquires(&pool->lock) · 2047 unmodified lines
2048 worker_set_flags(worker, WORKER_CPU_INTENSIVE, true);2048 worker_set_flags(worker, WORKER_CPU_INTENSIVE, true);
2049 2049
2050 /*2050 /*
2051 * Unbound pool isn't concurrency managed and work items should be2051 * Wake up another worker if necessary. The condition is always
2052 * executed ASAP. Wake up another worker if necessary.2052 * false for normal per-cpu workers since nr_running would always
2053 * be >= 1 at this point. This is used to chain execution of the
2054 * pending work items for WORKER_NOT_RUNNING workers such as the
2055 * UNBOUND ones.
2053 */2056 */
2054 if ((worker->flags & WORKER_UNBOUND) && need_more_worker(pool))2057 if (need_more_worker(pool))
2055 wake_up_worker(pool);2058 wake_up_worker(pool);
2056 2059
2057 /*2060 /*