workqueue: Work around edge cases for calc of pool's cpumask
There is an underlying assumption/trade-off in many layers of the Linux system that CPU <-> node mapping is static. This is despite the presence of features like NUMA and 'hotplug' that support the dynamic addition/ removal of fundamental system resources like CPUs and memory. PowerPC systems, however, do provide extensive features for the dynamic change of resources available to a system. Currently, there is little or no synchronization protection around the updating of the CPU <-> node mapping, and the export/update of this information for other layers / modules. In systems which can change this mapping during 'hotplug', like PowerPC, the information is changing underneath all layers that might reference it. This patch attempts to ensure that a valid, usable cpumask attribute is used by the workqueue infrastructure when setting up new resource pools. It prevents a crash that has been observed when an 'empty' cpumask is passed along to the worker/task scheduling code. It is intended as a temporary workaround until a more fundamental review and correction of the issue can be done. [With additions to the patch provided by Tejun Hao <tj@kernel.org>] Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
0a94efb5ac
commit
1ad0f0a7aa
@ -3577,6 +3577,13 @@ static bool wq_calc_node_cpumask(const struct workqueue_attrs *attrs, int node,
|
||||
|
||||
/* yeap, return possible CPUs in @node that @attrs wants */
|
||||
cpumask_and(cpumask, attrs->cpumask, wq_numa_possible_cpumask[node]);
|
||||
|
||||
if (cpumask_empty(cpumask)) {
|
||||
pr_warn_once("WARNING: workqueue cpumask: online intersect > "
|
||||
"possible intersect\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return !cpumask_equal(cpumask, attrs->cpumask);
|
||||
|
||||
use_dfl:
|
||||
|
Loading…
Reference in New Issue
Block a user