workqueue: Let DISASSOCIATED workers follow unbound wq cpumask changes

When workqueue cpumask changes are committed, the DISASSOCIATED workers
affinity is not touched and this might be a problem down the line for
isolated setups when the DISASSOCIATED pools still have works to run
after the cpu is offline.

Make sure the workers' affinity is updated every time a workqueue cpumask
changes, so these workers can't break isolation.

Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Waiman Long <longman@redhat.com>
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-17 11:09:12 +08:00 committed by Tejun Heo
parent e36bce4466
commit 8ac4dbe7dd

View file

@ -6926,6 +6926,10 @@ static int workqueue_apply_unbound_cpumask(const cpumask_var_t unbound_cpumask)
}
if (!ret) {
int cpu;
struct worker_pool *pool;
struct worker *worker;
mutex_lock(&wq_pool_attach_mutex);
cpumask_copy(wq_unbound_cpumask, unbound_cpumask);
/* rescuer needs to respect cpumask changes when it is not attached */
@ -6933,6 +6937,15 @@ static int workqueue_apply_unbound_cpumask(const cpumask_var_t unbound_cpumask)
if (wq->rescuer && !wq->rescuer->pool)
unbind_worker(wq->rescuer);
}
/* DISASSOCIATED worker needs to respect wq_unbound_cpumask */
for_each_possible_cpu(cpu) {
for_each_cpu_worker_pool(pool, cpu) {
if (!(pool->flags & POOL_DISASSOCIATED))
continue;
for_each_pool_worker(worker, pool)
unbind_worker(worker);
}
}
mutex_unlock(&wq_pool_attach_mutex);
}
return ret;