[PATCH] arm64/mm: return cpu_all_mask when node is NUMA_NO_NODE
liuzhengyuan at tj.kylinos.cn
Fri Sep 18 03:03:31 EDT 2020
On 2020/9/18 下午1:40, Gavin Shan wrote:
> Hi Zhengyuan,
> On 9/18/20 11:15 AM, Zhengyuan Liu wrote:
>> Filter out NUMA_NO_NODE before returning cpumask of a node, otherwise
>> it will triger the following WARN_ON(node >= nr_node_ids).
>> Signed-off-by: Zhengyuan Liu <liuzhengyuan at tj.kylinos.cn>
>> arch/arm64/mm/numa.c | 3 +++
>> 1 file changed, 3 insertions(+)
>> diff --git a/arch/arm64/mm/numa.c b/arch/arm64/mm/numa.c
>> index 73f8b49d485c..78f9b7dab656 100644
>> --- a/arch/arm64/mm/numa.c
>> +++ b/arch/arm64/mm/numa.c
>> @@ -46,6 +46,9 @@ EXPORT_SYMBOL(node_to_cpumask_map);
>> const struct cpumask *cpumask_of_node(int node)
>> + if (node == NUMA_NO_NODE)
>> + return cpu_all_mask;
>> if (WARN_ON(node >= nr_node_ids))
>> return cpu_none_mask;
> I don't understand how NUMA_NO_NODE triggers the warning, as mentioned
> in the change log. NUMA_NO_NODE is defined as (-1), but @nr_node_ids
> is always larger than 0. @cpu_all_mask returned in this case would be
> meaningless. It sounds not reasonable to pass invalid @node to this
node is defined as int while nr_node_ids is defined as unsigned int,
when both compare in WARN_ON() node will automatically
NUMA_NO_NODEconvert to unsigned int and that's why warning is triggered
> I guess the best way is to fix the issue from the caller. In the mean
> to report the invalid NUMA node would be helpful. So I think you might
> be need.
> Note the change log needs improvement either :)
> if (WARN_ON(node == NUMA_NO_NODE))
> return cpu_all_mask;
when run the kernel on UMA machine with CONFIG_NUMA enabled, the node
property of devices (dev->numa_node) is mainly initialized to
NUMA_NO_NODE. From this point, NUMA_NO_NODE seems not like a illegal
value and return cpu_all_mask seems reasonable. Actually, other arch
like sparc, alpha and powerpc also return cpu_all_mask in
cpumask_of_node() when passed NUMA_NO_NODE. x86 may need to fix this too.
BTW, I think we should add a check in numa.h too.
@@ -25,6 +25,9 @@ const struct cpumask *cpumask_of_node(int node);
/* Returns a pointer to the cpumask of CPUs on Node 'node'. */
static inline const struct cpumask *cpumask_of_node(int node)
+ if (node == NUMA_NO_NODE)
+ return cpu_all_mask;
> if (WARN_ON(node < 0 || node >= nr_node_ids)
> return cpu_none_mask;
> More information about @nr_node_ids: it has fixed value (1U) when
> MAX_NUMNODES is smaller than 2. Otherwise, it's initialized to number
> of NUMA nodes, probed from ACPI (SRAT) table, FDT, or dummy initialization.
> For the later case, @nr_node_ids is always larger than 0.
Thanks for explanation, nice for you.
More information about the linux-arm-kernel