• Oscar Salvador's avatar
    mm, page_alloc: fix has_unmovable_pages for HugePages · 17e2e7d7
    Oscar Salvador authored
    While playing with gigantic hugepages and memory_hotplug, I triggered
    the following #PF when "cat memoryX/removable":
    
      BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
      #PF error: [normal kernel read fault]
      PGD 0 P4D 0
      Oops: 0000 [#1] SMP PTI
      CPU: 1 PID: 1481 Comm: cat Tainted: G            E     4.20.0-rc6-mm1-1-default+ #18
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.0.0-prebuilt.qemu-project.org 04/01/2014
      RIP: 0010:has_unmovable_pages+0x154/0x210
      Call Trace:
       is_mem_section_removable+0x7d/0x100
       removable_show+0x90/0xb0
       dev_attr_show+0x1c/0x50
       sysfs_kf_seq_show+0xca/0x1b0
       seq_read+0x133/0x380
       __vfs_read+0x26/0x180
       vfs_read+0x89/0x140
       ksys_read+0x42/0x90
       do_syscall_64+0x5b/0x180
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    The reason is we do not pass the Head to page_hstate(), and so, the call
    to compound_order() in page_hstate() returns 0, so we end up checking
    all hstates's size to match PAGE_SIZE.
    
    Obviously, we do not find any hstate matching that size, and we return
    NULL.  Then, we dereference that NULL pointer in
    hugepage_migration_supported() and we got the #PF from above.
    
    Fix that by getting the head page before calling page_hstate().
    
    Also, since gigantic pages span several pageblocks, re-adjust the logic
    for skipping pages.  While are it, we can also get rid of the
    round_up().
    
    [osalvador@suse.de: remove round_up(), adjust skip pages logic per Michal]
      Link: http://lkml.kernel.org/r/20181221062809.31771-1-osalvador@suse.de
    Link: http://lkml.kernel.org/r/20181217225113.17864-1-osalvador@suse.deSigned-off-by: default avatarOscar Salvador <osalvador@suse.de>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Pavel Tatashin <pavel.tatashin@microsoft.com>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    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>
    17e2e7d7
page_alloc.c 225 KB