• Toshi Kani's avatar
    base/memory, hotplug: fix a kernel oops in show_valid_zones() · 6cb0497a
    Toshi Kani authored
    commit a96dfddb upstream.
    Reading a sysfs "memoryN/valid_zones" file leads to the following oops
    when the first page of a range is not backed by struct page.
    show_valid_zones() assumes that 'start_pfn' is always valid for
     BUG: unable to handle kernel paging request at ffffea017a000000
     IP: show_valid_zones+0x6f/0x160
    This issue may happen on x86-64 systems with 64GiB or more memory since
    their memory block size is bumped up to 2GiB.  [1] An example of such
    systems is desribed below.  0x3240000000 is only aligned by 1GiB and
    this memory block starts from 0x3200000000, which is not backed by
    struct page.
     BIOS-e820: [mem 0x0000003240000000-0x000000603fffffff] usable
    Since test_pages_in_a_zone() already checks holes, fix this issue by
    extending this function to return 'valid_start' and 'valid_end' for a
    given range.  show_valid_zones() then proceeds with the valid range.
    [1] 'Commit bdee237c ("x86: mm: Use 2GB memory block size on
        large-memory x86-64 systems")'
    Link: http://lkml.kernel.org/r/20170127222149.30893-3-toshi.kani@hpe.comSigned-off-by: default avatarToshi Kani <toshi.kani@hpe.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Zhang Zhen <zhenzhang.zhang@huawei.com>
    Cc: Reza Arbab <arbab@linux.vnet.ibm.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>