Skip to content

Commit eac8ea8

Browse files
RichardWeiYangrppt
authored andcommitted
mm/memblock: repeat setting reserved region nid if array is doubled
Commit 61167ad ("mm: pass nid to reserve_bootmem_region()") introduce a way to set nid to all reserved region. But there is a corner case it will leave some region with invalid nid. When memblock_set_node() doubles the array of memblock.reserved, it may lead to a new reserved region before current position. The new region will be left with an invalid node id. Repeat the process when detecting it. Fixes: 61167ad ("mm: pass nid to reserve_bootmem_region()") Signed-off-by: Wei Yang <richard.weiyang@gmail.com> CC: Mike Rapoport <rppt@kernel.org> CC: Yajun Deng <yajun.deng@linux.dev> CC: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250318071948.23854-3-richard.weiyang@gmail.com Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
1 parent 06eaa82 commit eac8ea8

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

mm/memblock.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,11 +2183,14 @@ static void __init memmap_init_reserved_pages(void)
21832183
struct memblock_region *region;
21842184
phys_addr_t start, end;
21852185
int nid;
2186+
unsigned long max_reserved;
21862187

21872188
/*
21882189
* set nid on all reserved pages and also treat struct
21892190
* pages for the NOMAP regions as PageReserved
21902191
*/
2192+
repeat:
2193+
max_reserved = memblock.reserved.max;
21912194
for_each_mem_region(region) {
21922195
nid = memblock_get_region_node(region);
21932196
start = region->base;
@@ -2198,6 +2201,13 @@ static void __init memmap_init_reserved_pages(void)
21982201

21992202
memblock_set_node(start, region->size, &memblock.reserved, nid);
22002203
}
2204+
/*
2205+
* 'max' is changed means memblock.reserved has been doubled its
2206+
* array, which may result a new reserved region before current
2207+
* 'start'. Now we should repeat the procedure to set its node id.
2208+
*/
2209+
if (max_reserved != memblock.reserved.max)
2210+
goto repeat;
22012211

22022212
/*
22032213
* initialize struct pages for reserved regions that don't have

0 commit comments

Comments
 (0)