• Mike Rapoport's avatar
    mm: fix initialization of struct page for holes in memory layout · d3921cb8
    Mike Rapoport authored
    There could be struct pages that are not backed by actual physical
    memory.  This can happen when the actual memory bank is not a multiple
    of SECTION_SIZE or when an architecture does not register memory holes
    reserved by the firmware as memblock.memory.
    
    Such pages are currently initialized using init_unavailable_mem()
    function that iterates through PFNs in holes in memblock.memory and if
    there is a struct page corresponding to a PFN, the fields if this page
    are set to default values and the page is marked as Reserved.
    
    init_unavailable_mem() does not take into account zone and node the page
    belongs to and sets both zone and node links in struct page to zero.
    
    On a system that has firmware reserved holes in a zone above ZONE_DMA,
    for instance in a configuration below:
    
    	# grep -A1 E820 /proc/iomem
    	7a17b000-7a216fff : Unknown E820 type
    	7a217000-7bffffff : System RAM
    
    unset zone link in struct page will trigger
    
    	VM_BUG_ON_PAGE(!zone_spans_pfn(page_zone(page), pfn), page);
    
    because there are pages in both ZONE_DMA32 and ZONE_DMA (unset zone link
    in struct page) in the same pageblock.
    
    Update init_unavailable_mem() to use zone constraints defined by an
    architecture to properly setup the zone link and use node ID of the
    adjacent range in memblock.memory to set the node link.
    
    Link: https://lkml.kernel.org/r/20210111194017.22696-3-rppt@kernel.org
    Fixes: 73a6e474 ("mm: memmap_init: iterate over memblock regions rather that check each PFN")
    Signed-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
    Reported-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Qian Cai <cai@lca.pw>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d3921cb8
page_alloc.c 249 KB