lkml.org 
[lkml]   [2015]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.1 045/159] mm: check if section present during memory block registering
    Date
    4.1-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Yinghai Lu <yinghai@kernel.org>

    commit 04697858d89e4bf2650364f8d6956e2554e8ef88 upstream.

    Tony Luck found on his setup, if memory block size 512M will cause crash
    during booting.

    BUG: unable to handle kernel paging request at ffffea0074000020
    IP: get_nid_for_pfn+0x17/0x40
    PGD 128ffcb067 PUD 128ffc9067 PMD 0
    Oops: 0000 [#1] SMP
    Modules linked in:
    CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.2.0-rc8 #1
    ...
    Call Trace:
    ? register_mem_sect_under_node+0x66/0xe0
    register_one_node+0x17b/0x240
    ? pci_iommu_alloc+0x6e/0x6e
    topology_init+0x3c/0x95
    do_one_initcall+0xcd/0x1f0

    The system has non continuous RAM address:
    BIOS-e820: [mem 0x0000001300000000-0x0000001cffffffff] usable
    BIOS-e820: [mem 0x0000001d70000000-0x0000001ec7ffefff] usable
    BIOS-e820: [mem 0x0000001f00000000-0x0000002bffffffff] usable
    BIOS-e820: [mem 0x0000002c18000000-0x0000002d6fffefff] usable
    BIOS-e820: [mem 0x0000002e00000000-0x00000039ffffffff] usable

    So there are start sections in memory block not present. For example:

    memory block : [0x2c18000000, 0x2c20000000) 512M

    first three sections are not present.

    The current register_mem_sect_under_node() assume first section is
    present, but memory block section number range [start_section_nr,
    end_section_nr] would include not present section.

    For arch that support vmemmap, we don't setup memmap for struct page
    area within not present sections area.

    So skip the pfn range that belong to absent section.

    [akpm@linux-foundation.org: simplification]
    [rientjes@google.com: more simplification]
    Fixes: bdee237c0343 ("x86: mm: Use 2GB memory block size on large memory x86-64 systems")
    Fixes: 982792c782ef ("x86, mm: probe memory block size for generic x86 64bit")
    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    Signed-off-by: David Rientjes <rientjes@google.com>
    Reported-by: Tony Luck <tony.luck@intel.com>
    Tested-by: Tony Luck <tony.luck@intel.com>
    Cc: Greg KH <greg@kroah.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Tested-by: David Rientjes <rientjes@google.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/base/node.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    --- a/drivers/base/node.c
    +++ b/drivers/base/node.c
    @@ -388,6 +388,16 @@ int register_mem_sect_under_node(struct
    for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
    int page_nid;

    + /*
    + * memory block could have several absent sections from start.
    + * skip pfn range from absent section
    + */
    + if (!pfn_present(pfn)) {
    + pfn = round_down(pfn + PAGES_PER_SECTION,
    + PAGES_PER_SECTION) - 1;
    + continue;
    + }
    +
    page_nid = get_nid_for_pfn(pfn);
    if (page_nid < 0)
    continue;



    \
     
     \ /
      Last update: 2015-09-26 23:41    [W:8.618 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site