diff options
-rw-r--r-- | Documentation/kmemleak.txt | 4 | ||||
-rw-r--r-- | lib/Kconfig.debug | 12 | ||||
-rw-r--r-- | mm/kmemleak.c | 5 |
3 files changed, 19 insertions, 2 deletions
diff --git a/Documentation/kmemleak.txt b/Documentation/kmemleak.txt index 0112da3b9ab8..f655308064d7 100644 --- a/Documentation/kmemleak.txt +++ b/Documentation/kmemleak.txt | |||
@@ -41,6 +41,10 @@ Memory scanning parameters can be modified at run-time by writing to the | |||
41 | Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on | 41 | Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on |
42 | the kernel command line. | 42 | the kernel command line. |
43 | 43 | ||
44 | Memory may be allocated or freed before kmemleak is initialised and | ||
45 | these actions are stored in an early log buffer. The size of this buffer | ||
46 | is configured via the CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE option. | ||
47 | |||
44 | Basic Algorithm | 48 | Basic Algorithm |
45 | --------------- | 49 | --------------- |
46 | 50 | ||
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 4c32b1a1a06e..12327b2bb785 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -359,6 +359,18 @@ config DEBUG_KMEMLEAK | |||
359 | In order to access the kmemleak file, debugfs needs to be | 359 | In order to access the kmemleak file, debugfs needs to be |
360 | mounted (usually at /sys/kernel/debug). | 360 | mounted (usually at /sys/kernel/debug). |
361 | 361 | ||
362 | config DEBUG_KMEMLEAK_EARLY_LOG_SIZE | ||
363 | int "Maximum kmemleak early log entries" | ||
364 | depends on DEBUG_KMEMLEAK | ||
365 | range 200 2000 | ||
366 | default 400 | ||
367 | help | ||
368 | Kmemleak must track all the memory allocations to avoid | ||
369 | reporting false positives. Since memory may be allocated or | ||
370 | freed before kmemleak is initialised, an early log buffer is | ||
371 | used to store these actions. If kmemleak reports "early log | ||
372 | buffer exceeded", please increase this value. | ||
373 | |||
362 | config DEBUG_KMEMLEAK_TEST | 374 | config DEBUG_KMEMLEAK_TEST |
363 | tristate "Simple test for the kernel memory leak detector" | 375 | tristate "Simple test for the kernel memory leak detector" |
364 | depends on DEBUG_KMEMLEAK | 376 | depends on DEBUG_KMEMLEAK |
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index c96f2c8700aa..17096d1b59b2 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c | |||
@@ -235,7 +235,7 @@ struct early_log { | |||
235 | }; | 235 | }; |
236 | 236 | ||
237 | /* early logging buffer and current position */ | 237 | /* early logging buffer and current position */ |
238 | static struct early_log early_log[200]; | 238 | static struct early_log early_log[CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE]; |
239 | static int crt_early_log; | 239 | static int crt_early_log; |
240 | 240 | ||
241 | static void kmemleak_disable(void); | 241 | static void kmemleak_disable(void); |
@@ -696,7 +696,8 @@ static void log_early(int op_type, const void *ptr, size_t size, | |||
696 | struct early_log *log; | 696 | struct early_log *log; |
697 | 697 | ||
698 | if (crt_early_log >= ARRAY_SIZE(early_log)) { | 698 | if (crt_early_log >= ARRAY_SIZE(early_log)) { |
699 | kmemleak_stop("Early log buffer exceeded\n"); | 699 | pr_warning("Early log buffer exceeded\n"); |
700 | kmemleak_disable(); | ||
700 | return; | 701 | return; |
701 | } | 702 | } |
702 | 703 | ||