• Qian Cai's avatar
    x86/mm: Fix a crash with kmemleak_scan() · 0d02113b
    Qian Cai authored
    The first kmemleak_scan() call after boot would trigger the crash below
    because this callpath:
    
      kernel_init
        free_initmem
          mem_encrypt_free_decrypted_mem
            free_init_pages
    
    unmaps memory inside the .bss when DEBUG_PAGEALLOC=y.
    
    kmemleak_init() will register the .data/.bss sections and then
    kmemleak_scan() will scan those addresses and dereference them looking
    for pointer references. If free_init_pages() frees and unmaps pages in
    those sections, kmemleak_scan() will crash if referencing one of those
    addresses:
    
      BUG: unable to handle kernel paging request at ffffffffbd402000
      CPU: 12 PID: 325 Comm: kmemleak Not tainted 5.1.0-rc4+ #4
      RIP: 0010:scan_block
      Call Trace:
       scan_gray_list
       kmemleak_scan
       kmemleak_scan_thread
       kthread
       ret_from_fork
    
    Since kmemleak_free_part() is tolerant to unknown objects (not tracked
    by kmemleak), it is fine to call it from free_init_pages() even if not
    all address ranges passed to this function are known to kmemleak.
    
     [ bp: Massage. ]
    
    Fixes: b3f0907c ("x86/mm: Add .bss..decrypted section to hold shared variables")
    Signed-off-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Brijesh Singh <brijesh.singh@amd.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: x86-ml <x86@kernel.org>
    Link: https://lkml.kernel.org/r/20190423165811.36699-1-cai@lca.pw
    0d02113b
init.c 27.5 KB