Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Revert "mm, memory_hotplug: initialize struct pages for the full memory section"

This reverts commit 2830bf6f05fb3e05bc4743274b806c821807a684.

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: 2830bf6f05fb ("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>

authored by

Michal Hocko and committed by
Linus Torvalds
4aa9fc2a f17b5f06

-12
-12
mm/page_alloc.c
··· 5701 5701 cond_resched(); 5702 5702 } 5703 5703 } 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 5716 5704 } 5717 5705 5718 5706 #ifdef CONFIG_ZONE_DEVICE