kmemleak: Introduce a default off mode for kmemleak

Introduce a new DEBUG_KMEMLEAK_DEFAULT_OFF config parameter that allows
kmemleak to be disabled by default, but enabled on the command line
via: kmemleak=on. Although a reboot is required to turn it on, its still
useful to not require a re-compile.

Signed-off-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Pekka Enberg <penberg@cs.helsinki.fi>
This commit is contained in:
Jason Baron 2010-07-19 11:54:17 +01:00 committed by Catalin Marinas
parent a7686a45c0
commit ab0155a22a
2 changed files with 20 additions and 1 deletions

View file

@ -400,6 +400,13 @@ config DEBUG_KMEMLEAK_TEST
If unsure, say N. If unsure, say N.
config DEBUG_KMEMLEAK_DEFAULT_OFF
bool "Default kmemleak to off"
depends on DEBUG_KMEMLEAK
help
Say Y here to disable kmemleak by default. It can then be enabled
on the command line via kmemleak=on.
config DEBUG_PREEMPT config DEBUG_PREEMPT
bool "Debug preemptible kernel" bool "Debug preemptible kernel"
depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT

View file

@ -211,6 +211,9 @@ static signed long jiffies_scan_wait;
static int kmemleak_stack_scan = 1; static int kmemleak_stack_scan = 1;
/* protects the memory scanning, parameters and debug/kmemleak file access */ /* protects the memory scanning, parameters and debug/kmemleak file access */
static DEFINE_MUTEX(scan_mutex); static DEFINE_MUTEX(scan_mutex);
/* setting kmemleak=on, will set this var, skipping the disable */
static int kmemleak_skip_disable;
/* /*
* Early object allocation/freeing logging. Kmemleak is initialized after the * Early object allocation/freeing logging. Kmemleak is initialized after the
@ -1604,7 +1607,9 @@ static int kmemleak_boot_config(char *str)
return -EINVAL; return -EINVAL;
if (strcmp(str, "off") == 0) if (strcmp(str, "off") == 0)
kmemleak_disable(); kmemleak_disable();
else if (strcmp(str, "on") != 0) else if (strcmp(str, "on") == 0)
kmemleak_skip_disable = 1;
else
return -EINVAL; return -EINVAL;
return 0; return 0;
} }
@ -1618,6 +1623,13 @@ void __init kmemleak_init(void)
int i; int i;
unsigned long flags; unsigned long flags;
#ifdef CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF
if (!kmemleak_skip_disable) {
kmemleak_disable();
return;
}
#endif
jiffies_min_age = msecs_to_jiffies(MSECS_MIN_AGE); jiffies_min_age = msecs_to_jiffies(MSECS_MIN_AGE);
jiffies_scan_wait = msecs_to_jiffies(SECS_SCAN_WAIT * 1000); jiffies_scan_wait = msecs_to_jiffies(SECS_SCAN_WAIT * 1000);