• Bhupesh Sharma's avatar
    mm/memcontrol: fix OOPS inside mem_cgroup_get_nr_swap_pages() · 82ff165c
    Bhupesh Sharma authored
    Prabhakar reported an OOPS inside mem_cgroup_get_nr_swap_pages()
    function in a corner case seen on some arm64 boards when kdump kernel
    runs with "cgroup_disable=memory" passed to the kdump kernel via
    bootargs.
    
    The root-cause behind the same is that currently mem_cgroup_swap_init()
    function is implemented as a subsys_initcall() call instead of a
    core_initcall(), this means 'cgroup_memory_noswap' still remains set to
    the default value (false) even when memcg is disabled via
    "cgroup_disable=memory" boot parameter.
    
    This may result in premature OOPS inside mem_cgroup_get_nr_swap_pages()
    function in corner cases:
    
      Unable to handle kernel NULL pointer dereference at virtual address 0000000000000188
      Mem abort info:
        ESR = 0x96000006
        EC = 0x25: DABT (current EL), IL = 32 bits
        SET = 0, FnV = 0
        EA = 0, S1PTW = 0
      Data abort info:
        ISV = 0, ISS = 0x00000006
        CM = 0, WnR = 0
      [0000000000000188] user address but active_mm is swapper
      Internal error: Oops: 96000006 [#1] SMP
      Modules linked in:
      <..snip..>
      Call trace:
        mem_cgroup_get_nr_swap_pages+0x9c/0xf4
        shrink_lruvec+0x404/0x4f8
        shrink_node+0x1a8/0x688
        do_try_to_free_pages+0xe8/0x448
        try_to_free_pages+0x110/0x230
        __alloc_pages_slowpath.constprop.106+0x2b8/0xb48
        __alloc_pages_nodemask+0x2ac/0x2f8
        alloc_page_interleave+0x20/0x90
        alloc_pages_current+0xdc/0xf8
        atomic_pool_expand+0x60/0x210
        __dma_atomic_pool_init+0x50/0xa4
        dma_atomic_pool_init+0xac/0x158
        do_one_initcall+0x50/0x218
        kernel_init_freeable+0x22c/0x2d0
        kernel_init+0x18/0x110
        ret_from_fork+0x10/0x18
      Code: aa1403e3 91106000 97f82a27 14000011 (f940c663)
      ---[ end trace 9795948475817de4 ]---
      Kernel panic - not syncing: Fatal exception
      Rebooting in 10 seconds..
    
    Fixes: eccb52e7 ("mm: memcontrol: prepare swap controller setup for integration")
    Reported-by: default avatarPrabhakar Kushwaha <pkushwaha@marvell.com>
    Signed-off-by: default avatarBhupesh Sharma <bhsharma@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Link: http://lkml.kernel.org/r/1593641660-13254-2-git-send-email-bhsharma@redhat.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    82ff165c
memcontrol.c 186 KB