• Paul E. McKenney's avatar
    mm: Add mem_dump_obj() to print source of memory block · 8e7f37f2
    Paul E. McKenney authored
    There are kernel facilities such as per-CPU reference counts that give
    error messages in generic handlers or callbacks, whose messages are
    unenlightening.  In the case of per-CPU reference-count underflow, this
    is not a problem when creating a new use of this facility because in that
    case the bug is almost certainly in the code implementing that new use.
    However, trouble arises when deploying across many systems, which might
    exercise corner cases that were not seen during development and testing.
    Here, it would be really nice to get some kind of hint as to which of
    several uses the underflow was caused by.
    
    This commit therefore exposes a mem_dump_obj() function that takes
    a pointer to memory (which must still be allocated if it has been
    dynamically allocated) and prints available information on where that
    memory came from.  This pointer can reference the middle of the block as
    well as the beginning of the block, as needed by things like RCU callback
    functions and timer handlers that might not know where the beginning of
    the memory block is.  These functions and handlers can use mem_dump_obj()
    to print out better hints as to where the problem might lie.
    
    The information printed can depend on kernel configuration.  For example,
    the allocation return address can be printed only for slab and slub,
    and even then only when the necessary debug has been enabled.  For slab,
    build with CONFIG_DEBUG_SLAB=y, and either use sizes with ample space
    to the next power of two or use the SLAB_STORE_USER when creating the
    kmem_cache structure.  For slub, build with CONFIG_SLUB_DEBUG=y and
    boot with slub_debug=U, or pass SLAB_STORE_USER to kmem_cache_create()
    if more focused use is desired.  Also for slub, use CONFIG_STACKTRACE
    to enable printing of the allocation-time stack trace.
    
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: <linux-mm@kvack.org>
    Reported-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    [ paulmck: Convert to printing and change names per Joonsoo Kim. ]
    [ paulmck: Move slab definition per Stephen Rothwell and kbuild test robot. ]
    [ paulmck: Handle CONFIG_MMU=n case where vmalloc() is kmalloc(). ]
    [ paulmck: Apply Vlastimil Babka feedback on slab.c kmem_provenance(). ]
    [ paulmck: Extract more info from !SLUB_DEBUG per Joonsoo Kim. ]
    [ paulmck: Explicitly check for small pointers per Naresh Kamboju. ]
    Acked-by: default avatarJoonsoo Kim <iamjoonsoo.kim@lge.com>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Tested-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    8e7f37f2
slab.h 16.6 KB