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

From: Tejun Heo
Date: Tue Jun 13 2017 - 16:10:38 EST


Hello,

On Tue, Jun 13, 2017 at 03:04:30PM -0500, Michael Bringmann wrote:
> @@ -3564,19 +3564,28 @@ static struct pool_workqueue *alloc_unbound_pwq(struct workqueue_struct *wq,
> static bool wq_calc_node_cpumask(const struct workqueue_attrs *attrs, int node,
> int cpu_going_down, cpumask_t *cpumask)
> {
> + cpumask_t onl_targ_cm;
> +
> if (!wq_numa_enabled || attrs->no_numa)
> goto use_dfl;
>
> /* does @node have any online CPUs @attrs wants? */
> - cpumask_and(cpumask, cpumask_of_node(node), attrs->cpumask);
> + cpumask_and(&onl_targ_cm, cpumask_of_node(node), attrs->cpumask);
> if (cpu_going_down >= 0)
> - cpumask_clear_cpu(cpu_going_down, cpumask);
> + cpumask_clear_cpu(cpu_going_down, &onl_targ_cm);
>
> - if (cpumask_empty(cpumask))
> + if (cpumask_empty(&onl_targ_cm))
> goto use_dfl;
>
> /* yeap, return possible CPUs in @node that @attrs wants */
> cpumask_and(cpumask, attrs->cpumask, wq_numa_possible_cpumask[node]);
> +
> + if (cpumask_weight(&onl_targ_cm) > cpumask_weight(cpumask)) {
> + printk(KERN_INFO "WARNING: WQ cpumask: onl intersect > "
> + "possible intersect\n");
> + return false;
> + }

Yeah, alternatively, we can just add right before returning,

if (WARN_ON(cpumask_empty(cpumask)))
return false;

Thanks.

--
tejun