kmemleak: add config to select auto scan
authorSri Krishna chowdary <schowdary@nvidia.com>
Fri, 28 Dec 2018 08:38:54 +0000 (00:38 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 28 Dec 2018 20:11:51 +0000 (12:11 -0800)
Kmemleak scan can be cpu intensive and can stall user tasks at times.  To
prevent this, add config DEBUG_KMEMLEAK_AUTO_SCAN to enable/disable auto
scan on boot up.  Also protect first_run with DEBUG_KMEMLEAK_AUTO_SCAN as
this is meant for only first automatic scan.

Link: http://lkml.kernel.org/r/1540231723-7087-1-git-send-email-prpatel@nvidia.com
Signed-off-by: Sri Krishna chowdary <schowdary@nvidia.com>
Signed-off-by: Sachin Nikam <snikam@nvidia.com>
Signed-off-by: Prateek <prpatel@nvidia.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/Kconfig.debug
mm/kmemleak.c

index b3c91b9e32f84e0f5ccb0bf303ba72e9f265dbb6..2b5a4256e88bc37b3a1b61278b2ed406493d2d5f 100644 (file)
@@ -593,6 +593,21 @@ config DEBUG_KMEMLEAK_DEFAULT_OFF
          Say Y here to disable kmemleak by default. It can then be enabled
          on the command line via kmemleak=on.
 
+config DEBUG_KMEMLEAK_AUTO_SCAN
+       bool "Enable kmemleak auto scan thread on boot up"
+       default y
+       depends on DEBUG_KMEMLEAK
+       help
+         Depending on the cpu, kmemleak scan may be cpu intensive and can
+         stall user tasks at times. This option enables/disables automatic
+         kmemleak scan at boot up.
+
+         Say N here to disable kmemleak auto scan thread to stop automatic
+         scanning. Disabling this option disables automatic reporting of
+         memory leaks.
+
+         If unsure, say Y.
+
 config DEBUG_STACK_USAGE
        bool "Stack utilization instrumentation"
        depends on DEBUG_KERNEL && !IA64
index 9c3d2dea086103652d56b2f67d96a80ace127ef0..f9d9dc250428142569672a5a5e7c56d8ff949e90 100644 (file)
@@ -1650,7 +1650,7 @@ static void kmemleak_scan(void)
  */
 static int kmemleak_scan_thread(void *arg)
 {
-       static int first_run = 1;
+       static int first_run = IS_ENABLED(CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN);
 
        pr_info("Automatic memory scanning thread started\n");
        set_user_nice(current, 10);
@@ -2144,9 +2144,11 @@ static int __init kmemleak_late_init(void)
                return -ENOMEM;
        }
 
-       mutex_lock(&scan_mutex);
-       start_scan_thread();
-       mutex_unlock(&scan_mutex);
+       if (IS_ENABLED(CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN)) {
+               mutex_lock(&scan_mutex);
+               start_scan_thread();
+               mutex_unlock(&scan_mutex);
+       }
 
        pr_info("Kernel memory leak detector initialized\n");