]> www.infradead.org Git - users/hch/xfs.git/commitdiff
workqueue: Don't bind the rescuer in the last working cpu
authorLai Jiangshan <jiangshan.ljs@antgroup.com>
Fri, 21 Jun 2024 07:32:23 +0000 (15:32 +0800)
committerTejun Heo <tj@kernel.org>
Fri, 21 Jun 2024 22:34:02 +0000 (12:34 -1000)
So that when the rescuer is woken up next time, it will not interrupt
the last working cpu which might be busy on other crucial works but
have nothing to do with the rescuer's incoming works.

Cc: Valentin Schneider <vschneid@redhat.com>
Signed-off-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/workqueue.c

index 9c5df39854352071216a9fa0c94b8f988d381451..cd18956301453d12f62004f048d2774b52b9dbf7 100644 (file)
@@ -2684,6 +2684,17 @@ static void worker_attach_to_pool(struct worker *worker,
        mutex_unlock(&wq_pool_attach_mutex);
 }
 
+static void unbind_worker(struct worker *worker)
+{
+       lockdep_assert_held(&wq_pool_attach_mutex);
+
+       kthread_set_per_cpu(worker->task, -1);
+       if (cpumask_intersects(wq_unbound_cpumask, cpu_active_mask))
+               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, wq_unbound_cpumask) < 0);
+       else
+               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_possible_mask) < 0);
+}
+
 /**
  * worker_detach_from_pool() - detach a worker from its pool
  * @worker: worker which is attached to its pool
@@ -2701,7 +2712,7 @@ static void worker_detach_from_pool(struct worker *worker)
 
        mutex_lock(&wq_pool_attach_mutex);
 
-       kthread_set_per_cpu(worker->task, -1);
+       unbind_worker(worker);
        list_del(&worker->node);
        worker->pool = NULL;
 
@@ -2796,17 +2807,6 @@ fail:
        return NULL;
 }
 
-static void unbind_worker(struct worker *worker)
-{
-       lockdep_assert_held(&wq_pool_attach_mutex);
-
-       kthread_set_per_cpu(worker->task, -1);
-       if (cpumask_intersects(wq_unbound_cpumask, cpu_active_mask))
-               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, wq_unbound_cpumask) < 0);
-       else
-               WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_possible_mask) < 0);
-}
-
 static void wake_dying_workers(struct list_head *cull_list)
 {
        struct worker *worker;