This option crashes the kernel whenever corruption is initially detected. This
is useful when trying to use crash dump analysis to determine where memory was
initially corrupted.

To enable this option use slub_debug=C.

[v2]
Panic in slab_err and object_err instead of BUG_ON.

Signed-off-by: Chris J Arges <chris.j.ar...@canonical.com>
---
 Documentation/vm/slub.txt | 2 ++
 include/linux/slab.h      | 1 +
 mm/slub.c                 | 9 +++++++++
 3 files changed, 12 insertions(+)

diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt
index e159c04..78fbe44 100644
--- a/Documentation/vm/slub.txt
+++ b/Documentation/vm/slub.txt
@@ -44,6 +44,8 @@ Possible debug options are
        A               Toggle failslab filter mark for the cache
        O               Switch debugging off for caches that would have
                        caused higher minimum slab orders
+       C               Crash kernel on corruption detection. (Useful for
+                       debugging with crash dumps)
        -               Switch all debugging off (useful if the kernel is
                        configured with CONFIG_SLUB_DEBUG_ON)
 
diff --git a/include/linux/slab.h b/include/linux/slab.h
index ed2ffaa..6c8eda9 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -23,6 +23,7 @@
 #define SLAB_DEBUG_FREE                0x00000100UL    /* DEBUG: Perform 
(expensive) checks on free */
 #define SLAB_RED_ZONE          0x00000400UL    /* DEBUG: Red zone objs in a 
cache */
 #define SLAB_POISON            0x00000800UL    /* DEBUG: Poison objects */
+#define SLAB_DEBUG_CRASH       0x00001000UL    /* DEBUG: Crash on any errors 
detected */
 #define SLAB_HWCACHE_ALIGN     0x00002000UL    /* Align objs on cache lines */
 #define SLAB_CACHE_DMA         0x00004000UL    /* Use GFP_DMA memory */
 #define SLAB_STORE_USER                0x00010000UL    /* DEBUG: Store the 
last owner for bug hunting */
diff --git a/mm/slub.c b/mm/slub.c
index 88482f8..89a8631 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -634,6 +634,9 @@ static void object_err(struct kmem_cache *s, struct page 
*page,
 {
        slab_bug(s, "%s", reason);
        print_trailer(s, page, object);
+
+       if (unlikely(s->flags & SLAB_DEBUG_CRASH))
+               panic("Panic on object error\n");
 }
 
 static void slab_err(struct kmem_cache *s, struct page *page,
@@ -648,6 +651,9 @@ static void slab_err(struct kmem_cache *s, struct page 
*page,
        slab_bug(s, "%s", buf);
        print_page_info(page);
        dump_stack();
+
+       if (unlikely(s->flags & SLAB_DEBUG_CRASH))
+               panic("Panic on slab error\n");
 }
 
 static void init_object(struct kmem_cache *s, void *object, u8 val)
@@ -1149,6 +1155,9 @@ static int __init setup_slub_debug(char *str)
                         */
                        disable_higher_order_debug = 1;
                        break;
+               case 'c':
+                       slub_debug |= SLAB_DEBUG_CRASH;
+                       break;
                default:
                        pr_err("slub_debug option '%c' unknown. skipped\n",
                               *str);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to