mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
SLUB: support slub_debug on by default
Add a new configuration variable CONFIG_SLUB_DEBUG_ON If set then the kernel will be booted by default with slab debugging switched on. Similar to CONFIG_SLAB_DEBUG. By default slab debugging is available but must be enabled by specifying "slub_debug" as a kernel parameter. Also add support to switch off slab debugging for a kernel that was built with CONFIG_SLUB_DEBUG_ON. This works by specifying slub_debug=- as a kernel parameter. Dave Jones wanted this feature. http://marc.info/?l=linux-kernel&m=118072189913045&w=2 [akpm@linux-foundation.org: clean up switch statement] Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
fc9a07e7bf
commit
f0630fff54
@ -1580,35 +1580,39 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
slram= [HW,MTD]
|
||||
|
||||
slub_debug [MM, SLUB]
|
||||
Enabling slub_debug allows one to determine the culprit
|
||||
if slab objects become corrupted. Enabling slub_debug
|
||||
creates guard zones around objects and poisons objects
|
||||
when not in use. Also tracks the last alloc / free.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
slub_debug[=options[,slabs]] [MM, SLUB]
|
||||
Enabling slub_debug allows one to determine the
|
||||
culprit if slab objects become corrupted. Enabling
|
||||
slub_debug can create guard zones around objects and
|
||||
may poison objects when not in use. Also tracks the
|
||||
last alloc / free. For more information see
|
||||
Documentation/vm/slub.txt.
|
||||
|
||||
slub_max_order= [MM, SLUB]
|
||||
Determines the maximum allowed order for slabs. Setting
|
||||
this too high may cause fragmentation.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
Determines the maximum allowed order for slabs.
|
||||
A high setting may cause OOMs due to memory
|
||||
fragmentation. For more information see
|
||||
Documentation/vm/slub.txt.
|
||||
|
||||
slub_min_objects= [MM, SLUB]
|
||||
The minimum objects per slab. SLUB will increase the
|
||||
slab order up to slub_max_order to generate a
|
||||
sufficiently big slab to satisfy the number of objects.
|
||||
The higher the number of objects the smaller the overhead
|
||||
of tracking slabs.
|
||||
The minimum number of objects per slab. SLUB will
|
||||
increase the slab order up to slub_max_order to
|
||||
generate a sufficiently large slab able to contain
|
||||
the number of objects indicated. The higher the number
|
||||
of objects the smaller the overhead of tracking slabs
|
||||
and the less frequently locks need to be acquired.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
|
||||
slub_min_order= [MM, SLUB]
|
||||
Determines the mininum page order for slabs. Must be
|
||||
lower than slub_max_order
|
||||
lower than slub_max_order.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
|
||||
slub_nomerge [MM, SLUB]
|
||||
Disable merging of slabs of similar size. May be
|
||||
Disable merging of slabs with similar size. May be
|
||||
necessary if there is some reason to distinguish
|
||||
allocs to different slabs.
|
||||
allocs to different slabs. Debug options disable
|
||||
merging on their own.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
|
||||
smart2= [HW]
|
||||
|
@ -41,6 +41,8 @@ Possible debug options are
|
||||
P Poisoning (object and padding)
|
||||
U User tracking (free and alloc)
|
||||
T Trace (please only use on single slabs)
|
||||
- Switch all debugging off (useful if the kernel is
|
||||
configured with CONFIG_SLUB_DEBUG_ON)
|
||||
|
||||
F.e. in order to boot just with sanity checks and red zoning one would specify:
|
||||
|
||||
|
@ -152,6 +152,19 @@ config DEBUG_SLAB_LEAK
|
||||
bool "Memory leak debugging"
|
||||
depends on DEBUG_SLAB
|
||||
|
||||
config SLUB_DEBUG_ON
|
||||
bool "SLUB debugging on by default"
|
||||
depends on SLUB && SLUB_DEBUG
|
||||
default n
|
||||
help
|
||||
Boot with debugging on by default. SLUB boots by default with
|
||||
the runtime debug capabilities switched off. Enabling this is
|
||||
equivalent to specifying the "slub_debug" parameter on boot.
|
||||
There is no support for more fine grained debug control like
|
||||
possible with slub_debug=xxx. SLUB debugging may be switched
|
||||
off in a kernel built with CONFIG_SLUB_DEBUG_ON by specifying
|
||||
"slub_debug=-".
|
||||
|
||||
config DEBUG_PREEMPT
|
||||
bool "Debug preemptible kernel"
|
||||
depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT
|
||||
|
81
mm/slub.c
81
mm/slub.c
@ -323,7 +323,11 @@ static inline int slab_index(void *p, struct kmem_cache *s, void *addr)
|
||||
/*
|
||||
* Debug settings:
|
||||
*/
|
||||
#ifdef CONFIG_SLUB_DEBUG_ON
|
||||
static int slub_debug = DEBUG_DEFAULT_FLAGS;
|
||||
#else
|
||||
static int slub_debug;
|
||||
#endif
|
||||
|
||||
static char *slub_debug_slabs;
|
||||
|
||||
@ -888,38 +892,57 @@ fail:
|
||||
|
||||
static int __init setup_slub_debug(char *str)
|
||||
{
|
||||
if (!str || *str != '=')
|
||||
slub_debug = DEBUG_DEFAULT_FLAGS;
|
||||
else {
|
||||
str++;
|
||||
if (*str == 0 || *str == ',')
|
||||
slub_debug = DEBUG_DEFAULT_FLAGS;
|
||||
else
|
||||
for( ;*str && *str != ','; str++)
|
||||
switch (*str) {
|
||||
case 'f' : case 'F' :
|
||||
slub_debug |= SLAB_DEBUG_FREE;
|
||||
break;
|
||||
case 'z' : case 'Z' :
|
||||
slub_debug |= SLAB_RED_ZONE;
|
||||
break;
|
||||
case 'p' : case 'P' :
|
||||
slub_debug |= SLAB_POISON;
|
||||
break;
|
||||
case 'u' : case 'U' :
|
||||
slub_debug |= SLAB_STORE_USER;
|
||||
break;
|
||||
case 't' : case 'T' :
|
||||
slub_debug |= SLAB_TRACE;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "slub_debug option '%c' "
|
||||
"unknown. skipped\n",*str);
|
||||
}
|
||||
}
|
||||
slub_debug = DEBUG_DEFAULT_FLAGS;
|
||||
if (*str++ != '=' || !*str)
|
||||
/*
|
||||
* No options specified. Switch on full debugging.
|
||||
*/
|
||||
goto out;
|
||||
|
||||
if (*str == ',')
|
||||
/*
|
||||
* No options but restriction on slabs. This means full
|
||||
* debugging for slabs matching a pattern.
|
||||
*/
|
||||
goto check_slabs;
|
||||
|
||||
slub_debug = 0;
|
||||
if (*str == '-')
|
||||
/*
|
||||
* Switch off all debugging measures.
|
||||
*/
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Determine which debug features should be switched on
|
||||
*/
|
||||
for ( ;*str && *str != ','; str++) {
|
||||
switch (tolower(*str)) {
|
||||
case 'f':
|
||||
slub_debug |= SLAB_DEBUG_FREE;
|
||||
break;
|
||||
case 'z':
|
||||
slub_debug |= SLAB_RED_ZONE;
|
||||
break;
|
||||
case 'p':
|
||||
slub_debug |= SLAB_POISON;
|
||||
break;
|
||||
case 'u':
|
||||
slub_debug |= SLAB_STORE_USER;
|
||||
break;
|
||||
case 't':
|
||||
slub_debug |= SLAB_TRACE;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "slub_debug option '%c' "
|
||||
"unknown. skipped\n",*str);
|
||||
}
|
||||
}
|
||||
|
||||
check_slabs:
|
||||
if (*str == ',')
|
||||
slub_debug_slabs = str + 1;
|
||||
out:
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user