Skip to content

Commit 0971e82

Browse files
committed
Merge tag 'fixes-2024-06-23' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock
Pull memblock fix from Mike Rapoport: "Fix fragility in checks for unset node ID. Use numa_valid_node() function to verify that nid is a valid node ID instead of inconsistent comparisons with either NUMA_NO_NODE or MAX_NUMNODES" * tag 'fixes-2024-06-23' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock: memblock: use numa_valid_node() helper to check for invalid node ID
2 parents b67eeff + 8043832 commit 0971e82

File tree

2 files changed

+12
-21
lines changed

2 files changed

+12
-21
lines changed

include/linux/numa.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
#define NUMA_NO_NODE (-1)
1616
#define NUMA_NO_MEMBLK (-1)
1717

18+
static inline bool numa_valid_node(int nid)
19+
{
20+
return nid >= 0 && nid < MAX_NUMNODES;
21+
}
22+
1823
/* optionally keep NUMA memory info available post init */
1924
#ifdef CONFIG_NUMA_KEEP_MEMINFO
2025
#define __initdata_or_meminfo

mm/memblock.c

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ bool __init_memblock memblock_validate_numa_coverage(unsigned long threshold_byt
754754

755755
/* calculate lose page */
756756
for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) {
757-
if (nid == NUMA_NO_NODE)
757+
if (!numa_valid_node(nid))
758758
nr_pages += end_pfn - start_pfn;
759759
}
760760

@@ -1061,7 +1061,7 @@ static bool should_skip_region(struct memblock_type *type,
10611061
return false;
10621062

10631063
/* only memory regions are associated with nodes, check it */
1064-
if (nid != NUMA_NO_NODE && nid != m_nid)
1064+
if (numa_valid_node(nid) && nid != m_nid)
10651065
return true;
10661066

10671067
/* skip hotpluggable memory regions if needed */
@@ -1118,10 +1118,6 @@ void __next_mem_range(u64 *idx, int nid, enum memblock_flags flags,
11181118
int idx_a = *idx & 0xffffffff;
11191119
int idx_b = *idx >> 32;
11201120

1121-
if (WARN_ONCE(nid == MAX_NUMNODES,
1122-
"Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n"))
1123-
nid = NUMA_NO_NODE;
1124-
11251121
for (; idx_a < type_a->cnt; idx_a++) {
11261122
struct memblock_region *m = &type_a->regions[idx_a];
11271123

@@ -1215,9 +1211,6 @@ void __init_memblock __next_mem_range_rev(u64 *idx, int nid,
12151211
int idx_a = *idx & 0xffffffff;
12161212
int idx_b = *idx >> 32;
12171213

1218-
if (WARN_ONCE(nid == MAX_NUMNODES, "Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n"))
1219-
nid = NUMA_NO_NODE;
1220-
12211214
if (*idx == (u64)ULLONG_MAX) {
12221215
idx_a = type_a->cnt - 1;
12231216
if (type_b != NULL)
@@ -1303,7 +1296,7 @@ void __init_memblock __next_mem_pfn_range(int *idx, int nid,
13031296

13041297
if (PFN_UP(r->base) >= PFN_DOWN(r->base + r->size))
13051298
continue;
1306-
if (nid == MAX_NUMNODES || nid == r_nid)
1299+
if (!numa_valid_node(nid) || nid == r_nid)
13071300
break;
13081301
}
13091302
if (*idx >= type->cnt) {
@@ -1339,10 +1332,6 @@ int __init_memblock memblock_set_node(phys_addr_t base, phys_addr_t size,
13391332
int start_rgn, end_rgn;
13401333
int i, ret;
13411334

1342-
if (WARN_ONCE(nid == MAX_NUMNODES,
1343-
"Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n"))
1344-
nid = NUMA_NO_NODE;
1345-
13461335
ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn);
13471336
if (ret)
13481337
return ret;
@@ -1452,9 +1441,6 @@ phys_addr_t __init memblock_alloc_range_nid(phys_addr_t size,
14521441
enum memblock_flags flags = choose_memblock_flags();
14531442
phys_addr_t found;
14541443

1455-
if (WARN_ONCE(nid == MAX_NUMNODES, "Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n"))
1456-
nid = NUMA_NO_NODE;
1457-
14581444
if (!align) {
14591445
/* Can't use WARNs this early in boot on powerpc */
14601446
dump_stack();
@@ -1467,7 +1453,7 @@ phys_addr_t __init memblock_alloc_range_nid(phys_addr_t size,
14671453
if (found && !memblock_reserve(found, size))
14681454
goto done;
14691455

1470-
if (nid != NUMA_NO_NODE && !exact_nid) {
1456+
if (numa_valid_node(nid) && !exact_nid) {
14711457
found = memblock_find_in_range_node(size, align, start,
14721458
end, NUMA_NO_NODE,
14731459
flags);
@@ -1987,7 +1973,7 @@ static void __init_memblock memblock_dump(struct memblock_type *type)
19871973
end = base + size - 1;
19881974
flags = rgn->flags;
19891975
#ifdef CONFIG_NUMA
1990-
if (memblock_get_region_node(rgn) != MAX_NUMNODES)
1976+
if (numa_valid_node(memblock_get_region_node(rgn)))
19911977
snprintf(nid_buf, sizeof(nid_buf), " on node %d",
19921978
memblock_get_region_node(rgn));
19931979
#endif
@@ -2181,7 +2167,7 @@ static void __init memmap_init_reserved_pages(void)
21812167
start = region->base;
21822168
end = start + region->size;
21832169

2184-
if (nid == NUMA_NO_NODE || nid >= MAX_NUMNODES)
2170+
if (!numa_valid_node(nid))
21852171
nid = early_pfn_to_nid(PFN_DOWN(start));
21862172

21872173
reserve_bootmem_region(start, end, nid);
@@ -2272,7 +2258,7 @@ static int memblock_debug_show(struct seq_file *m, void *private)
22722258

22732259
seq_printf(m, "%4d: ", i);
22742260
seq_printf(m, "%pa..%pa ", &reg->base, &end);
2275-
if (nid != MAX_NUMNODES)
2261+
if (numa_valid_node(nid))
22762262
seq_printf(m, "%4d ", nid);
22772263
else
22782264
seq_printf(m, "%4c ", 'x');

0 commit comments

Comments
 (0)