Loading Documentation/vm/slub.rst +64 −0 Original line number Diff line number Diff line Loading @@ -384,5 +384,69 @@ c) Execute ``slabinfo-gnuplot.sh`` in '-t' mode, passing all of the 40,60`` range will plot only samples collected between 40th and 60th seconds). DebugFS files for SLUB ====================== For more information about current state of SLUB caches with the user tracking debug option enabled, debugfs files are available, typically under /sys/kernel/debug/slab/<cache>/ (created only for caches with enabled user tracking). There are 2 types of these files with the following debug information: 1. alloc_traces:: Prints information about unique allocation traces of the currently allocated objects. The output is sorted by frequency of each trace. Information in the output: Number of objects, allocating function, minimal/average/maximal jiffies since alloc, pid range of the allocating processes, cpu mask of allocating cpus, and stack trace. Example::: 1085 populate_error_injection_list+0x97/0x110 age=166678/166680/166682 pid=1 cpus=1:: __slab_alloc+0x6d/0x90 kmem_cache_alloc_trace+0x2eb/0x300 populate_error_injection_list+0x97/0x110 init_error_injection+0x1b/0x71 do_one_initcall+0x5f/0x2d0 kernel_init_freeable+0x26f/0x2d7 kernel_init+0xe/0x118 ret_from_fork+0x22/0x30 2. free_traces:: Prints information about unique freeing traces of the currently allocated objects. The freeing traces thus come from the previous life-cycle of the objects and are reported as not available for objects allocated for the first time. The output is sorted by frequency of each trace. Information in the output: Number of objects, freeing function, minimal/average/maximal jiffies since free, pid range of the freeing processes, cpu mask of freeing cpus, and stack trace. Example::: 1980 <not-available> age=4294912290 pid=0 cpus=0 51 acpi_ut_update_ref_count+0x6a6/0x782 age=236886/237027/237772 pid=1 cpus=1 kfree+0x2db/0x420 acpi_ut_update_ref_count+0x6a6/0x782 acpi_ut_update_object_reference+0x1ad/0x234 acpi_ut_remove_reference+0x7d/0x84 acpi_rs_get_prt_method_data+0x97/0xd6 acpi_get_irq_routing_table+0x82/0xc4 acpi_pci_irq_find_prt_entry+0x8e/0x2e0 acpi_pci_irq_lookup+0x3a/0x1e0 acpi_pci_irq_enable+0x77/0x240 pcibios_enable_device+0x39/0x40 do_pci_enable_device.part.0+0x5d/0xe0 pci_enable_device_flags+0xfc/0x120 pci_enable_device+0x13/0x20 virtio_pci_probe+0x9e/0x170 local_pci_probe+0x48/0x80 pci_device_probe+0x105/0x1c0 Christoph Lameter, May 30, 2007 Sergey Senozhatsky, October 23, 2015 include/linux/slub_def.h +0 −1 Original line number Diff line number Diff line Loading @@ -105,7 +105,6 @@ struct kmem_cache { struct kmem_cache_order_objects oo; /* Allocation and freeing of slabs */ struct kmem_cache_order_objects max; struct kmem_cache_order_objects min; gfp_t allocflags; /* gfp flags to use on each alloc */ int refcount; /* Refcount for slab cache destroy */ Loading include/linux/stackdepot.h +22 −4 Original line number Diff line number Diff line Loading @@ -20,18 +20,36 @@ depot_stack_handle_t __stack_depot_save(unsigned long *entries, gfp_t gfp_flags, bool can_alloc); /* * Every user of stack depot has to call this during its own init when it's * decided that it will be calling stack_depot_save() later. * Every user of stack depot has to call stack_depot_init() during its own init * when it's decided that it will be calling stack_depot_save() later. This is * recommended for e.g. modules initialized later in the boot process, when * slab_is_available() is true. * * The alternative is to select STACKDEPOT_ALWAYS_INIT to have stack depot * enabled as part of mm_init(), for subsystems where it's known at compile time * that stack depot will be used. * * Another alternative is to call stack_depot_want_early_init(), when the * decision to use stack depot is taken e.g. when evaluating kernel boot * parameters, which precedes the enablement point in mm_init(). * * stack_depot_init() and stack_depot_want_early_init() can be called regardless * of CONFIG_STACKDEPOT and are no-op when disabled. The actual save/fetch/print * functions should only be called from code that makes sure CONFIG_STACKDEPOT * is enabled. */ #ifdef CONFIG_STACKDEPOT int stack_depot_init(void); #ifdef CONFIG_STACKDEPOT_ALWAYS_INIT static inline int stack_depot_early_init(void) { return stack_depot_init(); } void __init stack_depot_want_early_init(void); /* This is supposed to be called only from mm_init() */ int __init stack_depot_early_init(void); #else static inline int stack_depot_init(void) { return 0; } static inline void stack_depot_want_early_init(void) { } static inline int stack_depot_early_init(void) { return 0; } #endif Loading init/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -1875,6 +1875,7 @@ config SLUB_DEBUG default y bool "Enable SLUB debugging support" if EXPERT depends on SLUB && SYSFS select STACKDEPOT if STACKTRACE_SUPPORT help SLUB has extensive debug support features. Disabling these can result in significant savings in code size. This also disables Loading lib/Kconfig.debug +1 −0 Original line number Diff line number Diff line Loading @@ -709,6 +709,7 @@ config DEBUG_SLAB config SLUB_DEBUG_ON bool "SLUB debugging on by default" depends on SLUB && SLUB_DEBUG select STACKDEPOT_ALWAYS_INIT if STACKTRACE_SUPPORT default n help Boot with debugging on by default. SLUB boots by default with Loading Loading
Documentation/vm/slub.rst +64 −0 Original line number Diff line number Diff line Loading @@ -384,5 +384,69 @@ c) Execute ``slabinfo-gnuplot.sh`` in '-t' mode, passing all of the 40,60`` range will plot only samples collected between 40th and 60th seconds). DebugFS files for SLUB ====================== For more information about current state of SLUB caches with the user tracking debug option enabled, debugfs files are available, typically under /sys/kernel/debug/slab/<cache>/ (created only for caches with enabled user tracking). There are 2 types of these files with the following debug information: 1. alloc_traces:: Prints information about unique allocation traces of the currently allocated objects. The output is sorted by frequency of each trace. Information in the output: Number of objects, allocating function, minimal/average/maximal jiffies since alloc, pid range of the allocating processes, cpu mask of allocating cpus, and stack trace. Example::: 1085 populate_error_injection_list+0x97/0x110 age=166678/166680/166682 pid=1 cpus=1:: __slab_alloc+0x6d/0x90 kmem_cache_alloc_trace+0x2eb/0x300 populate_error_injection_list+0x97/0x110 init_error_injection+0x1b/0x71 do_one_initcall+0x5f/0x2d0 kernel_init_freeable+0x26f/0x2d7 kernel_init+0xe/0x118 ret_from_fork+0x22/0x30 2. free_traces:: Prints information about unique freeing traces of the currently allocated objects. The freeing traces thus come from the previous life-cycle of the objects and are reported as not available for objects allocated for the first time. The output is sorted by frequency of each trace. Information in the output: Number of objects, freeing function, minimal/average/maximal jiffies since free, pid range of the freeing processes, cpu mask of freeing cpus, and stack trace. Example::: 1980 <not-available> age=4294912290 pid=0 cpus=0 51 acpi_ut_update_ref_count+0x6a6/0x782 age=236886/237027/237772 pid=1 cpus=1 kfree+0x2db/0x420 acpi_ut_update_ref_count+0x6a6/0x782 acpi_ut_update_object_reference+0x1ad/0x234 acpi_ut_remove_reference+0x7d/0x84 acpi_rs_get_prt_method_data+0x97/0xd6 acpi_get_irq_routing_table+0x82/0xc4 acpi_pci_irq_find_prt_entry+0x8e/0x2e0 acpi_pci_irq_lookup+0x3a/0x1e0 acpi_pci_irq_enable+0x77/0x240 pcibios_enable_device+0x39/0x40 do_pci_enable_device.part.0+0x5d/0xe0 pci_enable_device_flags+0xfc/0x120 pci_enable_device+0x13/0x20 virtio_pci_probe+0x9e/0x170 local_pci_probe+0x48/0x80 pci_device_probe+0x105/0x1c0 Christoph Lameter, May 30, 2007 Sergey Senozhatsky, October 23, 2015
include/linux/slub_def.h +0 −1 Original line number Diff line number Diff line Loading @@ -105,7 +105,6 @@ struct kmem_cache { struct kmem_cache_order_objects oo; /* Allocation and freeing of slabs */ struct kmem_cache_order_objects max; struct kmem_cache_order_objects min; gfp_t allocflags; /* gfp flags to use on each alloc */ int refcount; /* Refcount for slab cache destroy */ Loading
include/linux/stackdepot.h +22 −4 Original line number Diff line number Diff line Loading @@ -20,18 +20,36 @@ depot_stack_handle_t __stack_depot_save(unsigned long *entries, gfp_t gfp_flags, bool can_alloc); /* * Every user of stack depot has to call this during its own init when it's * decided that it will be calling stack_depot_save() later. * Every user of stack depot has to call stack_depot_init() during its own init * when it's decided that it will be calling stack_depot_save() later. This is * recommended for e.g. modules initialized later in the boot process, when * slab_is_available() is true. * * The alternative is to select STACKDEPOT_ALWAYS_INIT to have stack depot * enabled as part of mm_init(), for subsystems where it's known at compile time * that stack depot will be used. * * Another alternative is to call stack_depot_want_early_init(), when the * decision to use stack depot is taken e.g. when evaluating kernel boot * parameters, which precedes the enablement point in mm_init(). * * stack_depot_init() and stack_depot_want_early_init() can be called regardless * of CONFIG_STACKDEPOT and are no-op when disabled. The actual save/fetch/print * functions should only be called from code that makes sure CONFIG_STACKDEPOT * is enabled. */ #ifdef CONFIG_STACKDEPOT int stack_depot_init(void); #ifdef CONFIG_STACKDEPOT_ALWAYS_INIT static inline int stack_depot_early_init(void) { return stack_depot_init(); } void __init stack_depot_want_early_init(void); /* This is supposed to be called only from mm_init() */ int __init stack_depot_early_init(void); #else static inline int stack_depot_init(void) { return 0; } static inline void stack_depot_want_early_init(void) { } static inline int stack_depot_early_init(void) { return 0; } #endif Loading
init/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -1875,6 +1875,7 @@ config SLUB_DEBUG default y bool "Enable SLUB debugging support" if EXPERT depends on SLUB && SYSFS select STACKDEPOT if STACKTRACE_SUPPORT help SLUB has extensive debug support features. Disabling these can result in significant savings in code size. This also disables Loading
lib/Kconfig.debug +1 −0 Original line number Diff line number Diff line Loading @@ -709,6 +709,7 @@ config DEBUG_SLAB config SLUB_DEBUG_ON bool "SLUB debugging on by default" depends on SLUB && SLUB_DEBUG select STACKDEPOT_ALWAYS_INIT if STACKTRACE_SUPPORT default n help Boot with debugging on by default. SLUB boots by default with Loading