| From 58e64214a7b5424f5f2d839270428056ac313523 Mon Sep 17 00:00:00 2001 |
| From: Qian Cai <cai@gmx.us> |
| Date: Fri, 30 Nov 2018 14:09:48 -0800 |
| Subject: debugobjects: avoid recursive calls with kmemleak |
| |
| [ Upstream commit 8de456cf87ba863e028c4dd01bae44255ce3d835 ] |
| |
| CONFIG_DEBUG_OBJECTS_RCU_HEAD does not play well with kmemleak due to |
| recursive calls. |
| |
| fill_pool |
| kmemleak_ignore |
| make_black_object |
| put_object |
| __call_rcu (kernel/rcu/tree.c) |
| debug_rcu_head_queue |
| debug_object_activate |
| debug_object_init |
| fill_pool |
| kmemleak_ignore |
| make_black_object |
| ... |
| |
| So add SLAB_NOLEAKTRACE to kmem_cache_create() to not register newly |
| allocated debug objects at all. |
| |
| Link: http://lkml.kernel.org/r/20181126165343.2339-1-cai@gmx.us |
| Signed-off-by: Qian Cai <cai@gmx.us> |
| Suggested-by: Catalin Marinas <catalin.marinas@arm.com> |
| Acked-by: Waiman Long <longman@redhat.com> |
| Acked-by: Catalin Marinas <catalin.marinas@arm.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Yang Shi <yang.shi@linux.alibaba.com> |
| Cc: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| lib/debugobjects.c | 5 ++--- |
| 1 file changed, 2 insertions(+), 3 deletions(-) |
| |
| diff --git a/lib/debugobjects.c b/lib/debugobjects.c |
| index 70935ed91125..14afeeb7d6ef 100644 |
| --- a/lib/debugobjects.c |
| +++ b/lib/debugobjects.c |
| @@ -135,7 +135,6 @@ static void fill_pool(void) |
| if (!new) |
| return; |
| |
| - kmemleak_ignore(new); |
| raw_spin_lock_irqsave(&pool_lock, flags); |
| hlist_add_head(&new->node, &obj_pool); |
| debug_objects_allocated++; |
| @@ -1128,7 +1127,6 @@ static int __init debug_objects_replace_static_objects(void) |
| obj = kmem_cache_zalloc(obj_cache, GFP_KERNEL); |
| if (!obj) |
| goto free; |
| - kmemleak_ignore(obj); |
| hlist_add_head(&obj->node, &objects); |
| } |
| |
| @@ -1184,7 +1182,8 @@ void __init debug_objects_mem_init(void) |
| |
| obj_cache = kmem_cache_create("debug_objects_cache", |
| sizeof (struct debug_obj), 0, |
| - SLAB_DEBUG_OBJECTS, NULL); |
| + SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, |
| + NULL); |
| |
| if (!obj_cache || debug_objects_replace_static_objects()) { |
| debug_objects_enabled = 0; |
| -- |
| 2.19.1 |
| |