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.
Showing the changes to kernel/workqueue.c (1 of 1 file). Show all
Unified · Split
| @@ -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 be | 2051 | * 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 | /* |