Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7576958a authored by Tejun Heo's avatar Tejun Heo
Browse files

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: default avatarTejun Heo <tj@kernel.org>
Reported-by: default avatarRay Jui <rjui@broadcom.com>
Cc: stable@kernel.org
parent 795abaf1
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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);
	}