From: Lai Jiangshan Date: Mon, 17 Nov 2025 03:09:12 +0000 (+0800) Subject: workqueue: Let DISASSOCIATED workers follow unbound wq cpumask changes X-Git-Tag: v6.19-rc1~179^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8ac4dbe7dd05f44121da120e480239dc89c3b496;p=thirdparty%2Fkernel%2Fstable.git 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 Cc: Waiman Long Signed-off-by: Lai Jiangshan Signed-off-by: Tejun Heo --- diff --git a/kernel/workqueue.c b/kernel/workqueue.c index bc673ceaac554..5916342ba6e3a 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -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;