[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20170525145907.GD23493@htj.duckdns.org>
Date: Thu, 25 May 2017 10:59:07 -0400
From: Tejun Heo <tj@...nel.org>
To: Michael Bringmann <mwb@...ux.vnet.ibm.com>
Cc: Lai Jiangshan <jiangshanlai@...il.com>,
linux-kernel@...r.kernel.org,
Nathan Fontenot <nfont@...ux.vnet.ibm.com>
Subject: Re: [PATCH V2] workqueue: Ensure that cpumask set for pools created
after boot
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@...ux.vnet.ibm.com>
> ---
> 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
Powered by blists - more mailing lists