kmemleak: Allow the early log buffer to be configurable.
authorCatalin Marinas <catalin.marinas@arm.com>
Thu, 25 Jun 2009 09:16:11 +0000 (10:16 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Thu, 25 Jun 2009 09:16:13 +0000 (10:16 +0100)
(feature suggested by Sergey Senozhatsky)

Kmemleak needs to track all the memory allocations but some of these
happen before kmemleak is initialised. These are stored in an internal
buffer which may be exceeded in some kernel configurations. This patch
adds a configuration option with a default value of 400 and also removes
the stack dump when the early log buffer is exceeded.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Sergey Senozhatsky <sergey.senozhatsky@mail.by>
Documentation/kmemleak.txt
lib/Kconfig.debug
mm/kmemleak.c

index 0112da3b9ab87f731006993c76e1a7fdc4eddcaa..f655308064d765ffccbd1fcb8c5e301283edbf60 100644 (file)
@@ -41,6 +41,10 @@ Memory scanning parameters can be modified at run-time by writing to the
 Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
 the kernel command line.
 
+Memory may be allocated or freed before kmemleak is initialised and
+these actions are stored in an early log buffer. The size of this buffer
+is configured via the CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE option.
+
 Basic Algorithm
 ---------------
 
index 4c32b1a1a06e393ad5d8844cdbefa00994965c2a..12327b2bb785c256a59cb864a2c2b8976c33e5aa 100644 (file)
@@ -359,6 +359,18 @@ config DEBUG_KMEMLEAK
          In order to access the kmemleak file, debugfs needs to be
          mounted (usually at /sys/kernel/debug).
 
+config DEBUG_KMEMLEAK_EARLY_LOG_SIZE
+       int "Maximum kmemleak early log entries"
+       depends on DEBUG_KMEMLEAK
+       range 200 2000
+       default 400
+       help
+         Kmemleak must track all the memory allocations to avoid
+         reporting false positives. Since memory may be allocated or
+         freed before kmemleak is initialised, an early log buffer is
+         used to store these actions. If kmemleak reports "early log
+         buffer exceeded", please increase this value.
+
 config DEBUG_KMEMLEAK_TEST
        tristate "Simple test for the kernel memory leak detector"
        depends on DEBUG_KMEMLEAK
index c96f2c8700aa687f5726eaed2e26a5ccd9d35d87..17096d1b59b27c725e238229463ad974d1e82c97 100644 (file)
@@ -235,7 +235,7 @@ struct early_log {
 };
 
 /* early logging buffer and current position */
-static struct early_log early_log[200];
+static struct early_log early_log[CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE];
 static int crt_early_log;
 
 static void kmemleak_disable(void);
@@ -696,7 +696,8 @@ static void log_early(int op_type, const void *ptr, size_t size,
        struct early_log *log;
 
        if (crt_early_log >= ARRAY_SIZE(early_log)) {
-               kmemleak_stop("Early log buffer exceeded\n");
+               pr_warning("Early log buffer exceeded\n");
+               kmemleak_disable();
                return;
        }