• David Hildenbrand's avatar
    drivers/base/memory: fix trying offlining memory blocks with memory holes on aarch64 · 92813053
    David Hildenbrand authored
    offline_pages() properly checks for memory holes and bails out.
    However, we do a page_zone(pfn_to_page(start_pfn)) before calling
    offline_pages() when offlining a memory block.
    
    We should not unconditionally call page_zone(pfn_to_page(start_pfn)) on
    aarch64 in offlining code, otherwise we can trigger a BUG when hitting a
    memory hole:
    
       kernel BUG at include/linux/mm.h:1383!
       Internal error: Oops - BUG: 0 [#1] SMP
       Modules linked in: loop processor efivarfs ip_tables x_tables ext4 mbcache jbd2 dm_mod igb nvme i2c_algo_bit mlx5_core i2c_core nvme_core firmware_class
       CPU: 13 PID: 1694 Comm: ranbug Not tainted 5.12.0-next-20210524+ #4
       Hardware name: MiTAC RAPTOR EV-883832-X3-0001/RAPTOR, BIOS 1.6 06/28/2020
       pstate: 60000005 (nZCv daif -PAN -UAO -TCO BTYPE=--)
       pc : memory_subsys_offline+0x1f8/0x250
       lr : memory_subsys_offline+0x1f8/0x250
       Call trace:
         memory_subsys_offline+0x1f8/0x250
         device_offline+0x154/0x1d8
         online_store+0xa4/0x118
         dev_attr_store+0x44/0x78
         sysfs_kf_write+0xe8/0x138
         kernfs_fop_write_iter+0x26c/0x3d0
         new_sync_write+0x2bc/0x4f8
         vfs_write+0x718/0xc88
         ksys_write+0xf8/0x1e0
         __arm64_sys_write+0x74/0xa8
         invoke_syscall.constprop.0+0x78/0x1e8
         do_el0_svc+0xe4/0x298
         el0_svc+0x20/0x30
         el0_sync_handler+0xb0/0xb8
         el0_sync+0x178/0x180
       Kernel panic - not syncing: Oops - BUG: Fatal exception
       SMP: stopping secondary CPUs
       Kernel Offset: disabled
       CPU features: 0x00000251,20000846
       Memory Limit: none
    
    If nr_vmemmap_pages is set, we know that we are dealing with hotplugged
    memory that doesn't have any holes.  So call
    page_zone(pfn_to_page(start_pfn)) only when really necessary -- when
    nr_vmemmap_pages is set and we actually adjust the present pages.
    
    Link: https://lkml.kernel.org/r/20210526075226.5572-1-david@redhat.com
    Fixes: a08a2ae3 ("mm,memory_hotplug: allocate memmap from the added memory range")
    Signed-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    Reported-by: default avatarQian Cai (QUIC) <quic_qiancai@quicinc.com>
    Reviewed-by: default avatarOscar Salvador <osalvador@suse.de>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Mike Rapoport <rppt@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    92813053
memory.c 22.1 KB