Skip to content

Commit

Permalink
workqueue: Don't bind the rescuer in the last working cpu
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Lai Jiangshan authored and Tejun Heo committed Jun 21, 2024
1 parent 68f8305 commit f45b1c3
Showing 1 changed file with 12 additions and 12 deletions.
24 changes: 12 additions & 12 deletions kernel/workqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;

Expand Down Expand Up @@ -2796,17 +2807,6 @@ static struct worker *create_worker(struct worker_pool *pool)
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;
Expand Down

0 comments on commit f45b1c3

Please sign in to comment.