• Vlastimil Babka's avatar
    mm, page_owner, debug_pagealloc: save and dump freeing stack trace · 8974558f
    Vlastimil Babka authored
    The debug_pagealloc functionality is useful to catch buggy page allocator
    users that cause e.g.  use after free or double free.  When page
    inconsistency is detected, debugging is often simpler by knowing the call
    stack of process that last allocated and freed the page.  When page_owner
    is also enabled, we record the allocation stack trace, but not freeing.
    
    This patch therefore adds recording of freeing process stack trace to page
    owner info, if both page_owner and debug_pagealloc are configured and
    enabled.  With only page_owner enabled, this info is not useful for the
    memory leak debugging use case.  dump_page() is adjusted to print the
    info.  An example result of calling __free_pages() twice may look like
    this (note the page last free stack trace):
    
    BUG: Bad page state in process bash  pfn:13d8f8
    page:ffffc31984f63e00 refcount:-1 mapcount:0 mapping:0000000000000000 index:0x0
    flags: 0x1affff800000000()
    raw: 01affff800000000 dead000000000100 dead000000000122 0000000000000000
    raw: 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000
    page dumped because: nonzero _refcount
    page_owner tracks the page as freed
    page last allocated via order 0, migratetype Unmovable, gfp_mask 0xcc0(GFP_KERNEL)
     prep_new_page+0x143/0x150
     get_page_from_freelist+0x289/0x380
     __alloc_pages_nodemask+0x13c/0x2d0
     khugepaged+0x6e/0xc10
     kthread+0xf9/0x130
     ret_from_fork+0x3a/0x50
    page last free stack trace:
     free_pcp_prepare+0x134/0x1e0
     free_unref_page+0x18/0x90
     khugepaged+0x7b/0xc10
     kthread+0xf9/0x130
     ret_from_fork+0x3a/0x50
    Modules linked in:
    CPU: 3 PID: 271 Comm: bash Not tainted 5.3.0-rc4-2.g07a1a73-default+ #57
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58-prebuilt.qemu.org 04/01/2014
    Call Trace:
     dump_stack+0x85/0xc0
     bad_page.cold+0xba/0xbf
     rmqueue_pcplist.isra.0+0x6c5/0x6d0
     rmqueue+0x2d/0x810
     get_page_from_freelist+0x191/0x380
     __alloc_pages_nodemask+0x13c/0x2d0
     __get_free_pages+0xd/0x30
     __pud_alloc+0x2c/0x110
     copy_page_range+0x4f9/0x630
     dup_mmap+0x362/0x480
     dup_mm+0x68/0x110
     copy_process+0x19e1/0x1b40
     _do_fork+0x73/0x310
     __x64_sys_clone+0x75/0x80
     do_syscall_64+0x6e/0x1e0
     entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x7f10af854a10
    ...
    
    Link: http://lkml.kernel.org/r/20190820131828.22684-5-vbabka@suse.czSigned-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Michal Hocko <mhocko@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8974558f
Kconfig.debug 4.74 KB