workqueue: wake up a worker when a rescuer is leaving a gcwq
After executing the matching works, a rescuer leaves the gcwq whether there are more pending works or not. This may decrease the concurrency level to zero and stall execution until a new work item is queued on the gcwq. Make rescuer wake up a regular worker when it leaves a gcwq if there are more works to execute, so that execution isn't stalled. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: Ray Jui <rjui@broadcom.com> Cc: stable@kernel.org
This commit is contained in:
Родитель
795abaf1e4
Коммит
7576958a9d
|
@ -2047,6 +2047,15 @@ repeat:
|
|||
move_linked_works(work, scheduled, &n);
|
||||
|
||||
process_scheduled_works(rescuer);
|
||||
|
||||
/*
|
||||
* Leave this gcwq. If keep_working() is %true, notify a
|
||||
* regular worker; otherwise, we end up with 0 concurrency
|
||||
* and stalling the execution.
|
||||
*/
|
||||
if (keep_working(gcwq))
|
||||
wake_up_worker(gcwq);
|
||||
|
||||
spin_unlock_irq(&gcwq->lock);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче