From abdbd8329281f40afd381346410d6d43604af82c Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:21 +0900 Subject: [PATCH 1/9] mm: numa_memblks: set numa_nodes_parsed in numa_add_memblk() Every existing numa_add_memblk() caller separately marks the new node in numa_nodes_parsed with node_set(). Set the node in numa_add_memblk() itself on a successful add, so this no longer depends on each caller. numa_add_memblk_to() now returns -EINVAL for an out-of-range node id, so a zero return implies @nid was valid. No caller passes an invalid one, so existing callers are unaffected. The per-caller node_set() calls are removed in later patches. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-2-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- mm/numa_memblks.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/mm/numa_memblks.c b/mm/numa_memblks.c index 3c3c4eac3514..844c71d6d4c0 100644 --- a/mm/numa_memblks.c +++ b/mm/numa_memblks.c @@ -135,13 +135,20 @@ EXPORT_SYMBOL(__node_distance); static int __init numa_add_memblk_to(int nid, u64 start, u64 end, struct numa_meminfo *mi) { + /* whine about and ignore invalid nid */ + if (nid < 0 || nid >= MAX_NUMNODES) { + pr_warn("Warning: invalid memblk node id %d [mem %#010Lx-%#010Lx]\n", + nid, start, end - 1); + return -EINVAL; + } + /* ignore zero length blks */ if (start == end) return 0; - /* whine about and ignore invalid blks */ - if (start > end || nid < 0 || nid >= MAX_NUMNODES) { - pr_warn("Warning: invalid memblk node %d [mem %#010Lx-%#010Lx]\n", + /* whine about and ignore invalid ranges */ + if (start > end) { + pr_warn("Warning: invalid memblk range for node %d [mem %#010Lx-%#010Lx]\n", nid, start, end - 1); return 0; } @@ -193,13 +200,20 @@ static void __init numa_move_tail_memblk(struct numa_meminfo *dst, int idx, * @end: End address of the new memblk * * Add a new memblk to the default numa_meminfo. + * On success @nid is also set in numa_nodes_parsed. * * RETURNS: * 0 on success, -errno on failure. */ int __init numa_add_memblk(int nid, u64 start, u64 end) { - return numa_add_memblk_to(nid, start, end, &numa_meminfo); + int ret; + + ret = numa_add_memblk_to(nid, start, end, &numa_meminfo); + if (!ret) + node_set(nid, numa_nodes_parsed); + + return ret; } /** From 7cbdade40fb8f440c13ccd7a02d104bf32285187 Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:22 +0900 Subject: [PATCH 2/9] ACPI: NUMA: remove redundant numa_nodes_parsed node_set() numa_add_memblk() now sets the node in numa_nodes_parsed itself, so the caller's own node_set() is redundant. Remove it. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-3-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- drivers/acpi/numa/srat.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c index 62d4a8df0b8c..5c407dc6401e 100644 --- a/drivers/acpi/numa/srat.c +++ b/drivers/acpi/numa/srat.c @@ -399,8 +399,6 @@ acpi_parse_memory_affinity(union acpi_subtable_headers *header, goto out_err_bad_srat; } - node_set(node, numa_nodes_parsed); - pr_info("SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]%s%s\n", node, pxm, (unsigned long long) start, (unsigned long long) end - 1, From 3b1e5d902dfa832e4b175cb1f5a000236d45ceb5 Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:23 +0900 Subject: [PATCH 3/9] of/numa: remove redundant numa_nodes_parsed node_set() numa_add_memblk() now sets the node in numa_nodes_parsed itself, so the caller's own node_set() is redundant. Remove it. No functional change. Signed-off-by: Sang-Heon Jeon Acked-by: Rob Herring (Arm) Link: https://patch.msgid.link/20260703041329.2797584-4-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- drivers/of/of_numa.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c index cd2dc8e825c9..230d5f628c1b 100644 --- a/drivers/of/of_numa.c +++ b/drivers/of/of_numa.c @@ -59,11 +59,8 @@ static int __init of_numa_parse_memory_nodes(void) r = -EINVAL; } - for (i = 0; !r && !of_address_to_resource(np, i, &rsrc); i++) { + for (i = 0; !r && !of_address_to_resource(np, i, &rsrc); i++) r = numa_add_memblk(nid, rsrc.start, rsrc.end + 1); - if (!r) - node_set(nid, numa_nodes_parsed); - } if (!i || r) { of_node_put(np); From 63fa742bae02f0d2ffe95ff540a51837815abc5c Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:24 +0900 Subject: [PATCH 4/9] x86/numa: remove redundant numa_nodes_parsed node_set() numa_add_memblk() now sets the node in numa_nodes_parsed itself, so the caller's own node_set() is redundant. Remove it. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-5-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- arch/x86/mm/amdtopology.c | 1 - arch/x86/mm/numa.c | 1 - 2 files changed, 2 deletions(-) diff --git a/arch/x86/mm/amdtopology.c b/arch/x86/mm/amdtopology.c index f980b0eb0105..1cb581bbf2b6 100644 --- a/arch/x86/mm/amdtopology.c +++ b/arch/x86/mm/amdtopology.c @@ -150,7 +150,6 @@ int __init amd_numa_init(void) prevbase = base; numa_add_memblk(nodeid, base, limit); - node_set(nodeid, numa_nodes_parsed); } if (nodes_empty(numa_nodes_parsed)) diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 99d0a9332c14..ced66e68a68e 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c @@ -216,7 +216,6 @@ static int __init dummy_numa_init(void) printk(KERN_INFO "Faking a node at [mem %#018Lx-%#018Lx]\n", 0LLU, PFN_PHYS(max_pfn) - 1); - node_set(0, numa_nodes_parsed); node_set(0, numa_phys_nodes_parsed); numa_add_memblk(0, 0, PFN_PHYS(max_pfn)); From 8b9cecbdc78c5a6cfaaf3b00ce7ebe05cf5417e7 Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:25 +0900 Subject: [PATCH 5/9] arch_numa: remove redundant numa_nodes_parsed node_set() numa_add_memblk() now sets the node in numa_nodes_parsed itself, so the caller's own node_set() is redundant. Remove it. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-6-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- drivers/base/arch_numa.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/base/arch_numa.c b/drivers/base/arch_numa.c index c99f2ab105e5..19bc806313c4 100644 --- a/drivers/base/arch_numa.c +++ b/drivers/base/arch_numa.c @@ -283,7 +283,6 @@ static int __init dummy_numa_init(void) pr_err("NUMA init failed\n"); return ret; } - node_set(0, numa_nodes_parsed); numa_off = true; return 0; From 3aeac07c5b1c3399487f4b38182f8cfbc3dbbd53 Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:26 +0900 Subject: [PATCH 6/9] LoongArch: remove redundant numa_nodes_parsed node_set() numa_add_memblk() now sets the node in numa_nodes_parsed itself, so the caller's own node_set() is redundant. Remove it. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-7-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- arch/loongarch/kernel/numa.c | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/loongarch/kernel/numa.c b/arch/loongarch/kernel/numa.c index 8b89898e20df..c96c53623715 100644 --- a/arch/loongarch/kernel/numa.c +++ b/arch/loongarch/kernel/numa.c @@ -216,7 +216,6 @@ static int __init fake_numa_init(void) phys_addr_t start = memblock_start_of_DRAM(); phys_addr_t end = memblock_end_of_DRAM() - 1; - node_set(0, numa_nodes_parsed); pr_info("Faking a node at [mem %pap-%pap]\n", &start, &end); return numa_add_memblk(0, start, end + 1); From a9bafc1832d2db97813069823821ed333b8ecda6 Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:27 +0900 Subject: [PATCH 7/9] mm: numa_memblks: remove redundant numa_nodemask_from_meminfo() numa_add_memblk() now sets each added node in numa_nodes_parsed, so numa_nodes_parsed already contains every node that owns memory. The nodes numa_nodemask_from_meminfo() adds from numa_meminfo are already set, so the calls in numa_alloc_distance() and numa_register_meminfo() are redundant. So remove both call sites and the unused function itself. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-8-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- mm/numa_memblks.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/mm/numa_memblks.c b/mm/numa_memblks.c index 844c71d6d4c0..67dc9f4edd7b 100644 --- a/mm/numa_memblks.c +++ b/mm/numa_memblks.c @@ -17,20 +17,6 @@ nodemask_t numa_nodes_parsed __initdata; static struct numa_meminfo numa_meminfo __initdata_or_meminfo; static struct numa_meminfo numa_reserved_meminfo __initdata_or_meminfo; -/* - * Set nodes, which have memory in @mi, in *@nodemask. - */ -static void __init numa_nodemask_from_meminfo(nodemask_t *nodemask, - const struct numa_meminfo *mi) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(mi->blk); i++) - if (mi->blk[i].start != mi->blk[i].end && - mi->blk[i].nid != NUMA_NO_NODE) - node_set(mi->blk[i].nid, *nodemask); -} - /** * numa_reset_distance - Reset NUMA distance table * @@ -56,7 +42,6 @@ static int __init numa_alloc_distance(void) /* size the new table and allocate it */ nodes_parsed = numa_nodes_parsed; - numa_nodemask_from_meminfo(&nodes_parsed, &numa_meminfo); for_each_node_mask(i, nodes_parsed) cnt = i; @@ -415,7 +400,6 @@ static int __init numa_register_meminfo(struct numa_meminfo *mi) /* Account for nodes with cpus and no memory */ node_possible_map = numa_nodes_parsed; - numa_nodemask_from_meminfo(&node_possible_map, mi); if (WARN_ON(nodes_empty(node_possible_map))) return -EINVAL; From f5a77a50a14dffb659ee8f550c824f8280e37fce Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:28 +0900 Subject: [PATCH 8/9] arch_numa: remove redundant node_possible_map assignment numa_register_meminfo() sets node_possible_map to numa_nodes_parsed. The later assignment in numa_register_nodes() is therefore redundant, so remove it. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-9-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- drivers/base/arch_numa.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/base/arch_numa.c b/drivers/base/arch_numa.c index 19bc806313c4..d4e426aa51c5 100644 --- a/drivers/base/arch_numa.c +++ b/drivers/base/arch_numa.c @@ -221,9 +221,6 @@ static int __init numa_register_nodes(void) node_set_online(nid); } - /* Setup online nodes to actual nodes*/ - node_possible_map = numa_nodes_parsed; - return 0; } From e55424c84afd48aa2f0f761ae0c006128ef541cf Mon Sep 17 00:00:00 2001 From: Sang-Heon Jeon Date: Fri, 3 Jul 2026 13:13:29 +0900 Subject: [PATCH 9/9] mm: numa_memblks: use numa_add_reserved_memblk() in numa_cleanup_meminfo() numa_cleanup_meminfo() calls the internal numa_add_memblk_to() to add a block to numa_reserved_meminfo, even though numa_add_reserved_memblk() wraps exactly that. Use the wrapper instead, so numa_add_memblk_to() is reached only through its two wrappers. No functional change. Signed-off-by: Sang-Heon Jeon Link: https://patch.msgid.link/20260703041329.2797584-10-ekffu200098@gmail.com Signed-off-by: Mike Rapoport (Microsoft) --- mm/numa_memblks.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mm/numa_memblks.c b/mm/numa_memblks.c index 67dc9f4edd7b..be6e7346f6c7 100644 --- a/mm/numa_memblks.c +++ b/mm/numa_memblks.c @@ -255,8 +255,7 @@ int __init numa_cleanup_meminfo(struct numa_meminfo *mi) /* preserve info for non-RAM areas above 'max_pfn': */ if (bi->end > high) { - numa_add_memblk_to(bi->nid, high, bi->end, - &numa_reserved_meminfo); + numa_add_reserved_memblk(bi->nid, high, bi->end); bi->end = high; }