• David Hildenbrand's avatar
    mm/memory_hotplug: initialize memmap of !ZONE_DEVICE with PageOffline() instead of PageReserved() · 503b158f
    David Hildenbrand authored
    We currently initialize the memmap such that PG_reserved is set and the
    refcount of the page is 1.  In virtio-mem code, we have to manually clear
    that PG_reserved flag to make memory offlining with partially hotplugged
    memory blocks possible: has_unmovable_pages() would otherwise bail out on
    such pages.
    
    We want to avoid PG_reserved where possible and move to typed pages
    instead.  Further, we want to further enlighten memory offlining code
    about PG_offline: offline pages in an online memory section.  One example
    is handling managed page count adjustments in a cleaner way during memory
    offlining.
    
    So let's initialize the pages with PG_offline instead of PG_reserved. 
    generic_online_page()->__free_pages_core() will now clear that flag before
    handing that memory to the buddy.
    
    Note that the page refcount is still 1 and would forbid offlining of such
    memory except when special care is take during GOING_OFFLINE as currently
    only implemented by virtio-mem.
    
    With this change, we can now get non-PageReserved() pages in the XEN
    balloon list.  From what I can tell, that can already happen via
    decrease_reservation(), so that should be fine.
    
    HV-balloon should not really observe a change: partial online memory
    blocks still cannot get surprise-offlined, because the refcount of these
    PageOffline() pages is 1.
    
    Update virtio-mem, HV-balloon and XEN-balloon code to be aware that
    hotplugged pages are now PageOffline() instead of PageReserved() before
    they are handed over to the buddy.
    
    We'll leave the ZONE_DEVICE case alone for now.
    
    Note that self-hosted vmemmap pages will no longer be marked as
    reserved.  This matches ordinary vmemmap pages allocated from the buddy
    during memory hotplug.  Now, really only vmemmap pages allocated from
    memblock during early boot will be marked reserved.  Existing
    PageReserved() checks seem to be handling all relevant cases correctly
    even after this change.
    
    Link: https://lkml.kernel.org/r/20240607090939.89524-3-david@redhat.comSigned-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    Acked-by: Oscar Salvador <osalvador@suse.de> [generic memory-hotplug bits]
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Dexuan Cui <decui@microsoft.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Eugenio Pérez <eperezma@redhat.com>
    Cc: Haiyang Zhang <haiyangz@microsoft.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: "K. Y. Srinivasan" <kys@microsoft.com>
    Cc: Marco Elver <elver@google.com>
    Cc: Michael S. Tsirkin <mst@redhat.com>
    Cc: Mike Rapoport (IBM) <rppt@kernel.org>
    Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
    Cc: Stefano Stabellini <sstabellini@kernel.org>
    Cc: Wei Liu <wei.liu@kernel.org>
    Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    503b158f
virtio_mem.c 82.7 KB