Messages in this thread | | | From | Valentin Schneider <> | Subject | Re: [PATCH 10/10] workqueue: Fix affinity of kworkers when attaching into pool | Date | Tue, 15 Dec 2020 15:03:20 +0000 |
| |
On 14/12/20 15:54, Lai Jiangshan wrote: > @@ -1848,11 +1848,11 @@ static void worker_attach_to_pool(struct worker *worker, > { > mutex_lock(&wq_pool_attach_mutex); > > - /* > - * set_cpus_allowed_ptr() will fail if the cpumask doesn't have any > - * online CPUs. It'll be re-applied when any of the CPUs come up. > - */ > - set_cpus_allowed_ptr(worker->task, pool->attrs->cpumask); > + /* Is there any cpu in pool->attrs->cpumask online? */ > + if (cpumask_any_and(pool->attrs->cpumask, wq_online_cpumask) < nr_cpu_ids)
if (cpumask_intersects(pool->attrs->cpumask, wq_online_cpumask))
> + WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, pool->attrs->cpumask) < 0); > + else > + WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_possible_mask) < 0);
So for that late-spawned per-CPU kworker case: the outgoing CPU should have already been cleared from wq_online_cpumask, so it gets its affinity reset to the possible mask and the subsequent wakeup will ensure it's put on an active CPU.
Seems alright to me.
> > /* > * The wq_pool_attach_mutex ensures %POOL_DISASSOCIATED remains
| |