diff options
| author | David Keitel <dkeitel@codeaurora.org> | 2014-10-21 16:26:17 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 11:03:32 -0700 |
| commit | 747b0dceaea4cecff7a3adad6c657a656c9aeb43 (patch) | |
| tree | 75ce9c3a60c3f17c88a5e3fe31dc78a44259ef9c | |
| parent | a31c7a448b7fa57680d3af5c559fb38e9c1a0a98 (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.c | 16 |
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, |
