• Mike Rapoport's avatar
    mm/page_alloc: always initialize memory map for the holes · c3ab6baf
    Mike Rapoport authored
    Patch series "mm: ensure consistency of memory map poisoning".
    
    Currently memory map allocation for FLATMEM case does not poison the
    struct pages regardless of CONFIG_PAGE_POISON setting.
    
    This happens because allocation of the memory map for FLATMEM and SPARSMEM
    use different memblock functions and those that are used for SPARSMEM case
    (namely memblock_alloc_try_nid_raw() and memblock_alloc_exact_nid_raw())
    implicitly poison the allocated memory.
    
    Another side effect of this implicit poisoning is that early setup code
    that uses the same functions to allocate memory burns cycles for the
    memory poisoning even if it was not intended.
    
    These patches introduce memmap_alloc() wrapper that ensure that the memory
    map allocation is consistent for different memory models.
    
    This patch (of 4):
    
    Currently memory map for the holes is initialized only when SPARSEMEM
    memory model is used.  Yet, even with FLATMEM there could be holes in the
    physical memory layout that have memory map entries.
    
    For instance, the memory reserved using e820 API on i386 or
    "reserved-memory" nodes in device tree would not appear in memblock.memory
    and hence the struct pages for such holes will be skipped during memory
    map initialization.
    
    These struct pages will be zeroed because the memory map for FLATMEM
    systems is allocated with memblock_alloc_node() that clears the allocated
    memory.  While zeroed struct pages do not cause immediate problems, the
    correct behaviour is to initialize every page using __init_single_page().
    Besides, enabling page poison for FLATMEM case will trigger
    PF_POISONED_CHECK() unless the memory map is properly initialized.
    
    Make sure init_unavailable_range() is called for both SPARSEMEM and
    FLATMEM so that struct pages representing memory holes would appear as
    PG_Reserved with any memory layout.
    
    [rppt@kernel.org: fix microblaze]
      Link: https://lkml.kernel.org/r/YQWW3RCE4eWBuMu/@kernel.org
    
    Link: https://lkml.kernel.org/r/20210714123739.16493-1-rppt@kernel.org
    Link: https://lkml.kernel.org/r/20210714123739.16493-2-rppt@kernel.orgSigned-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
    Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
    Tested-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Cc: Michal Simek <monstr@monstr.eu>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c3ab6baf
page_alloc.c 262 KB