Skip to content

Commit 4aa9fc2

Browse files
Michal Hockotorvalds
authored andcommitted
Revert "mm, memory_hotplug: initialize struct pages for the full memory section"
This reverts commit 2830bf6. The underlying assumption that one sparse section belongs into a single numa node doesn't hold really. Robert Shteynfeld has reported a boot failure. The boot log was not captured but his memory layout is as follows: Early memory node ranges node 1: [mem 0x0000000000001000-0x0000000000090fff] node 1: [mem 0x0000000000100000-0x00000000dbdf8fff] node 1: [mem 0x0000000100000000-0x0000001423ffffff] node 0: [mem 0x0000001424000000-0x0000002023ffffff] This means that node0 starts in the middle of a memory section which is also in node1. memmap_init_zone tries to initialize padding of a section even when it is outside of the given pfn range because there are code paths (e.g. memory hotplug) which assume that the full worth of memory section is always initialized. In this particular case, though, such a range is already intialized and most likely already managed by the page allocator. Scribbling over those pages corrupts the internal state and likely blows up when any of those pages gets used. Reported-by: Robert Shteynfeld <robert.shteynfeld@gmail.com> Fixes: 2830bf6 ("mm, memory_hotplug: initialize struct pages for the full memory section") Cc: stable@kernel.org Signed-off-by: Michal Hocko <mhocko@suse.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent f17b5f0 commit 4aa9fc2

File tree

1 file changed

+0
-12
lines changed

1 file changed

+0
-12
lines changed

mm/page_alloc.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5701,18 +5701,6 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
57015701
cond_resched();
57025702
}
57035703
}
5704-
#ifdef CONFIG_SPARSEMEM
5705-
/*
5706-
* If the zone does not span the rest of the section then
5707-
* we should at least initialize those pages. Otherwise we
5708-
* could blow up on a poisoned page in some paths which depend
5709-
* on full sections being initialized (e.g. memory hotplug).
5710-
*/
5711-
while (end_pfn % PAGES_PER_SECTION) {
5712-
__init_single_page(pfn_to_page(end_pfn), end_pfn, zone, nid);
5713-
end_pfn++;
5714-
}
5715-
#endif
57165704
}
57175705

57185706
#ifdef CONFIG_ZONE_DEVICE

0 commit comments

Comments
 (0)