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.

mm: zero unavailable pages before memmap init

We must zero struct pages for memory that is not backed by physical
memory, or kernel does not have access to.

Recently, there was a change which zeroed all memmap for all holes in
e820. Unfortunately, it introduced a bug that is discussed here:

https://www.spinics.net/lists/linux-mm/msg156764.html

Linus, also saw this bug on his machine, and confirmed that reverting
commit 124049decbb1 ("x86/e820: put !E820_TYPE_RAM regions into
memblock.reserved") fixes the issue.

The problem is that we incorrectly zero some struct pages after they
were setup.

The fix is to zero unavailable struct pages prior to initializing of
struct pages.

A more detailed fix should come later that would avoid double zeroing
cases: one in __init_single_page(), the other one in
zero_resv_unavail().

Fixes: 124049decbb1 ("x86/e820: put !E820_TYPE_RAM regions into memblock.reserved")
Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Pavel Tatashin and committed by
Linus Torvalds
e181ae0c 2db39a2f

+2 -2
+2 -2
mm/page_alloc.c
··· 6847 6847 /* Initialise every node */ 6848 6848 mminit_verify_pageflags_layout(); 6849 6849 setup_nr_node_ids(); 6850 + zero_resv_unavail(); 6850 6851 for_each_online_node(nid) { 6851 6852 pg_data_t *pgdat = NODE_DATA(nid); 6852 6853 free_area_init_node(nid, NULL, ··· 6858 6857 node_set_state(nid, N_MEMORY); 6859 6858 check_for_memory(pgdat, nid); 6860 6859 } 6861 - zero_resv_unavail(); 6862 6860 } 6863 6861 6864 6862 static int __init cmdline_parse_core(char *p, unsigned long *core, ··· 7033 7033 7034 7034 void __init free_area_init(unsigned long *zones_size) 7035 7035 { 7036 + zero_resv_unavail(); 7036 7037 free_area_init_node(0, zones_size, 7037 7038 __pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL); 7038 - zero_resv_unavail(); 7039 7039 } 7040 7040 7041 7041 static int page_alloc_cpu_dead(unsigned int cpu)