Re: [PATCH V2] workqueue: Ensure that cpumask set for pools created after boot

From: Tejun Heo
Date: Thu May 25 2017 - 10:59:15 EST


Hello, Michael.

On Thu, May 25, 2017 at 09:55:10AM -0500, Michael Bringmann wrote:
> On NUMA systems with dynamic processors, the content of the cpumask
> may change over time. As new processors are added via DLPAR operations,
> workqueues are created for them. This patch ensures that the pools
> created for new workqueues will be initialized with a cpumask before
> the first worker is created, attached, and woken up. If the mask is
> not set up, then the kernel will crash when 'wakeup_process' is unable
> to find a valid CPU to which to assign the new worker.
>
> Signed-off-by: Michael Bringmann <mwb@xxxxxxxxxxxxxxxxxx>
> ---
> Changes in V2:
> -- Only fill in empty cpumasks.
> ---
> kernel/workqueue.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index c74bf39..1b16ac4 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -3366,6 +3366,9 @@ static struct worker_pool *get_unbound_pool(const struct workqueue_attrs *attrs)
> copy_workqueue_attrs(pool->attrs, attrs);
> pool->node = target_node;
>
> + if (!cpumask_weight(pool->attrs->cpumask))
> + cpumask_copy(pool->attrs->cpumask, cpumask_of(smp_processor_id()));
> +

So, the problem is that control is reaching here with empty mask.
Filling it with an arbitrary cpu id doesn't really fix the bug. I
think I just messed up wq_calc_node_cpumask(). Will send a fix soon.

Thanks.

--
tejun