lkml.org 
[lkml]   [2019]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 030/183] Revert "mm: use early_pfn_to_nid in page_ext_init"
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

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

    [ Upstream commit 2f1ee0913ce58efe7f18fbd518bd54c598559b89 ]

    This reverts commit fe53ca54270a ("mm: use early_pfn_to_nid in
    page_ext_init").

    When booting a system with "page_owner=on",

    start_kernel
    page_ext_init
    invoke_init_callbacks
    init_section_page_ext
    init_page_owner
    init_early_allocated_pages
    init_zones_in_node
    init_pages_in_zone
    lookup_page_ext
    page_to_nid

    The issue here is that page_to_nid() will not work since some page flags
    have no node information until later in page_alloc_init_late() due to
    DEFERRED_STRUCT_PAGE_INIT. Hence, it could trigger an out-of-bounds
    access with an invalid nid.

    UBSAN: Undefined behaviour in ./include/linux/mm.h:1104:50
    index 7 is out of range for type 'zone [5]'

    Also, kernel will panic since flags were poisoned earlier with,

    CONFIG_DEBUG_VM_PGFLAGS=y
    CONFIG_NODE_NOT_IN_PAGE_FLAGS=n

    start_kernel
    setup_arch
    pagetable_init
    paging_init
    sparse_init
    sparse_init_nid
    memblock_alloc_try_nid_raw

    It did not handle it well in init_pages_in_zone() which ends up calling
    page_to_nid().

    page:ffffea0004200000 is uninitialized and poisoned
    raw: ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff
    raw: ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff
    page dumped because: VM_BUG_ON_PAGE(PagePoisoned(p))
    page_owner info is not active (free page?)
    kernel BUG at include/linux/mm.h:990!
    RIP: 0010:init_page_owner+0x486/0x520

    This means that assumptions behind commit fe53ca54270a ("mm: use
    early_pfn_to_nid in page_ext_init") are incomplete. Therefore, revert
    the commit for now. A proper way to move the page_owner initialization
    to sooner is to hook into memmap initialization.

    Link: http://lkml.kernel.org/r/20190115202812.75820-1-cai@lca.pw
    Signed-off-by: Qian Cai <cai@lca.pw>
    Acked-by: Michal Hocko <mhocko@kernel.org>
    Cc: Pasha Tatashin <Pavel.Tatashin@microsoft.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Yang Shi <yang.shi@linaro.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    init/main.c | 3 ++-
    mm/page_ext.c | 4 +---
    2 files changed, 3 insertions(+), 4 deletions(-)

    diff --git a/init/main.c b/init/main.c
    index c4a45145e102..3d3d79c5a232 100644
    --- a/init/main.c
    +++ b/init/main.c
    @@ -663,7 +663,6 @@ asmlinkage __visible void __init start_kernel(void)
    initrd_start = 0;
    }
    #endif
    - page_ext_init();
    kmemleak_init();
    debug_objects_mem_init();
    setup_per_cpu_pageset();
    @@ -1069,6 +1068,8 @@ static noinline void __init kernel_init_freeable(void)
    sched_init_smp();

    page_alloc_init_late();
    + /* Initialize page ext after all struct pages are initialized. */
    + page_ext_init();

    do_basic_setup();

    diff --git a/mm/page_ext.c b/mm/page_ext.c
    index 2c16216c29b6..2c44f5b78435 100644
    --- a/mm/page_ext.c
    +++ b/mm/page_ext.c
    @@ -396,10 +396,8 @@ void __init page_ext_init(void)
    * We know some arch can have a nodes layout such as
    * -------------pfn-------------->
    * N0 | N1 | N2 | N0 | N1 | N2|....
    - *
    - * Take into account DEFERRED_STRUCT_PAGE_INIT.
    */
    - if (early_pfn_to_nid(pfn) != nid)
    + if (pfn_to_nid(pfn) != nid)
    continue;
    if (init_section_page_ext(pfn, nid))
    goto oom;
    --
    2.19.1


    \
     
     \ /
      Last update: 2019-03-22 13:58    [W:2.445 / U:0.832 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site