Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f0630fff54a239efbbd89faf6a62da071ef1ff78
Commit:     f0630fff54a239efbbd89faf6a62da071ef1ff78
Parent:     fc9a07e7bf1a76e710f5df017abb07628db1781d
Author:     Christoph Lameter <[EMAIL PROTECTED]>
AuthorDate: Sun Jul 15 23:38:14 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Mon Jul 16 09:05:36 2007 -0700

    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
    
    [EMAIL PROTECTED]: clean up switch statement]
    Signed-off-by: Christoph Lameter <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 Documentation/kernel-parameters.txt |   38 +++++++++-------
 Documentation/vm/slub.txt           |    2 +
 lib/Kconfig.debug                   |   13 ++++++
 mm/slub.c                           |   79 ++++++++++++++++++++++------------
 4 files changed, 87 insertions(+), 45 deletions(-)

diff --git a/Documentation/kernel-parameters.txt 
b/Documentation/kernel-parameters.txt
index 4344f69..8916410 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -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]
diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt
index 1523320..df812b0 100644
--- a/Documentation/vm/slub.txt
+++ b/Documentation/vm/slub.txt
@@ -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:
 
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index fab32a2..6408440 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -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
diff --git a/mm/slub.c b/mm/slub.c
index e0cf621..6aea489 100644
--- a/mm/slub.c
+++ b/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;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to