diff options
| author | Lai Jiangshan <jiangshan.ljs@antgroup.com> | 2025-11-21 22:57:14 +0800 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2025-11-21 09:45:36 -1000 |
| commit | 99ed6f62a46e91dc796b785618d646eeded1b230 (patch) | |
| tree | f12b97986ebd0e021ba68d1087862dd7a60aa87e /kernel/workqueue.c | |
| parent | c9c19e8bbc1ebc4e74140f7f9acbd90dcdf36748 (diff) | |
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>
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index d9ce3ab0ec23..0e5ec6e002b1 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -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); /* |