summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Keitel <dkeitel@codeaurora.org>2014-10-21 16:26:17 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:03:32 -0700
commit747b0dceaea4cecff7a3adad6c657a656c9aeb43 (patch)
tree75ce9c3a60c3f17c88a5e3fe31dc78a44259ef9c
parenta31c7a448b7fa57680d3af5c559fb38e9c1a0a98 (diff)
mm: slub: panic for object and slab errors
If the SLUB_DEBUG_PANIC_ON Kconfig option is selected, also panic for object and slab errors to allow capturing relevant debug data. Change-Id: Idc582ef48d3c0d866fa89cf8660ff0a5402f7e15 Signed-off-by: David Keitel <dkeitel@codeaurora.org>
-rw-r--r--mm/slub.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/mm/slub.c b/mm/slub.c
index 6424d30edb9b..f12102b4aef9 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -652,11 +652,21 @@ static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p)
dump_stack();
}
+#ifdef CONFIG_SLUB_DEBUG_PANIC_ON
+static void slab_panic(const char *cause)
+{
+ panic("%s\n", cause);
+}
+#else
+static inline void slab_panic(const char *cause) {}
+#endif
+
void object_err(struct kmem_cache *s, struct page *page,
u8 *object, char *reason)
{
slab_bug(s, "%s", reason);
print_trailer(s, page, object);
+ slab_panic(reason);
}
static void slab_err(struct kmem_cache *s, struct page *page,
@@ -671,6 +681,7 @@ static void slab_err(struct kmem_cache *s, struct page *page,
slab_bug(s, "%s", buf);
print_page_info(page);
dump_stack();
+ slab_panic("slab error");
}
static void init_object(struct kmem_cache *s, void *object, u8 val)
@@ -689,12 +700,9 @@ static void init_object(struct kmem_cache *s, void *object, u8 val)
static void restore_bytes(struct kmem_cache *s, char *message, u8 data,
void *from, void *to)
{
-#ifdef CONFIG_SLUB_DEBUG_PANIC_ON
- panic("Found corruption 0x%p-0x%p=0x%x\n", from, to - 1, data);
-#else
+ slab_panic("object poison overwritten");
slab_fix(s, "Restoring 0x%p-0x%p=0x%x\n", from, to - 1, data);
memset(from, data, to - from);
-#endif
}
static int check_bytes_and_report(struct kmem_cache *s, struct page *page,