workqueue: Factor out assign_rescuer_work()

Move the code to assign work to rescuer and assign_rescuer_work().

Signed-off-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
Lai Jiangshan
2025-11-21 22:57:14 +08:00
committed by Tejun Heo
parent c9c19e8bbc
commit 99ed6f62a4

View File

@@ -3437,6 +3437,23 @@ sleep:
goto woke_up;
}
static bool assign_rescuer_work(struct pool_workqueue *pwq, struct worker *rescuer)
{
struct worker_pool *pool = pwq->pool;
struct work_struct *work, *n;
/*
* Slurp in all works issued via this workqueue and
* process'em.
*/
list_for_each_entry_safe(work, n, &pool->worklist, entry) {
if (get_work_pwq(work) == pwq && assign_work(work, rescuer, &n))
pwq->stats[PWQ_STAT_RESCUED]++;
}
return !list_empty(&rescuer->scheduled);
}
/**
* rescuer_thread - the rescuer thread function
* @__rescuer: self
@@ -3491,7 +3508,6 @@ repeat:
struct pool_workqueue *pwq = list_first_entry(&wq->maydays,
struct pool_workqueue, mayday_node);
struct worker_pool *pool = pwq->pool;
struct work_struct *work, *n;
__set_current_state(TASK_RUNNING);
list_del_init(&pwq->mayday_node);
@@ -3502,18 +3518,9 @@ repeat:
raw_spin_lock_irq(&pool->lock);
/*
* Slurp in all works issued via this workqueue and
* process'em.
*/
WARN_ON_ONCE(!list_empty(&rescuer->scheduled));
list_for_each_entry_safe(work, n, &pool->worklist, entry) {
if (get_work_pwq(work) == pwq &&
assign_work(work, rescuer, &n))
pwq->stats[PWQ_STAT_RESCUED]++;
}
if (!list_empty(&rescuer->scheduled)) {
if (assign_rescuer_work(pwq, rescuer)) {
process_scheduled_works(rescuer);
/*