Commit 99ed6f62 authored by Lai Jiangshan's avatar Lai Jiangshan Committed by Tejun Heo
Browse files

workqueue: Factor out assign_rescuer_work()



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

Signed-off-by: default avatarLai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent c9c19e8b
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -3437,6 +3437,23 @@ static int worker_thread(void *__worker)
	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 @@ static int rescuer_thread(void *__rescuer)
		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 @@ static int rescuer_thread(void *__rescuer)

		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);

			/*