• David Hildenbrand's avatar
    mm/memory_hotplug.c: don't allow to online/offline memory blocks with holes · c5e79ef5
    David Hildenbrand authored
    Our onlining/offlining code is unnecessarily complicated.  Only memory
    blocks added during boot can have holes (a range that is not
    IORESOURCE_SYSTEM_RAM).  Hotplugged memory never has holes (e.g., see
    add_memory_resource()).  All memory blocks that belong to boot memory
    are already online.
    
    Note that boot memory can have holes and the memmap of the holes is
    marked PG_reserved.  However, also memory allocated early during boot is
    PG_reserved - basically every page of boot memory that is not given to
    the buddy is PG_reserved.
    
    Therefore, when we stop allowing to offline memory blocks with holes, we
    implicitly no longer have to deal with onlining memory blocks with
    holes.  E.g., online_pages() will do a walk_system_ram_range(...,
    online_pages_range), whereby online_pages_range() will effectively only
    free the memory holes not falling into a hole to the buddy.  The other
    pages (holes) are kept PG_reserved (via
    move_pfn_range_to_zone()->memmap_init_zone()).
    
    This allows to simplify the code.  For example, we no longer have to
    worry about marking pages that fall into memory holes PG_reserved when
    onlining memory.  We can stop setting pages PG_reserved completely in
    memmap_init_zone().
    
    Offlining memory blocks added during boot is usually not guaranteed to
    work either way (unmovable data might have easily ended up on that
    memory during boot).  So stopping to do that should not really hurt.
    Also, people are not even aware of a setup where onlining/offlining of
    memory blocks with holes used to work reliably (see [1] and [2]
    especially regarding the hotplug path) - I doubt it worked reliably.
    
    For the use case of offlining memory to unplug DIMMs, we should see no
    change.  (holes on DIMMs would be weird).
    
    Please note that hardware errors (PG_hwpoison) are not memory holes and
    are not affected by this change when offlining.
    
    [1] https://lkml.org/lkml/2019/10/22/135
    [2] https://lkml.org/lkml/2019/8/14/1365
    
    Link: http://lkml.kernel.org/r/20191119115237.6662-1-david@redhat.comReviewed-by: default avatarDan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Naoya Horiguchi <nao.horiguchi@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c5e79ef5
memory_hotplug.c 48.2 KB