diff options
author | Qian Cai <cai@gmx.us> | 2018-11-30 17:09:48 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-11-30 17:56:14 -0500 |
commit | 8de456cf87ba863e028c4dd01bae44255ce3d835 (patch) | |
tree | ed5a4baf7f2e82b3f8f0d3db330edc54a1c42731 /lib/debugobjects.c | |
parent | dcf7fe9d89763a28e0f43975b422ff141fe79e43 (diff) |
debugobjects: avoid recursive calls with kmemleak
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>
Diffstat (limited to 'lib/debugobjects.c')
-rw-r--r-- | lib/debugobjects.c | 5 |
1 files 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) | |||
135 | if (!new) | 135 | if (!new) |
136 | return; | 136 | return; |
137 | 137 | ||
138 | kmemleak_ignore(new); | ||
139 | raw_spin_lock_irqsave(&pool_lock, flags); | 138 | raw_spin_lock_irqsave(&pool_lock, flags); |
140 | hlist_add_head(&new->node, &obj_pool); | 139 | hlist_add_head(&new->node, &obj_pool); |
141 | debug_objects_allocated++; | 140 | debug_objects_allocated++; |
@@ -1128,7 +1127,6 @@ static int __init debug_objects_replace_static_objects(void) | |||
1128 | obj = kmem_cache_zalloc(obj_cache, GFP_KERNEL); | 1127 | obj = kmem_cache_zalloc(obj_cache, GFP_KERNEL); |
1129 | if (!obj) | 1128 | if (!obj) |
1130 | goto free; | 1129 | goto free; |
1131 | kmemleak_ignore(obj); | ||
1132 | hlist_add_head(&obj->node, &objects); | 1130 | hlist_add_head(&obj->node, &objects); |
1133 | } | 1131 | } |
1134 | 1132 | ||
@@ -1184,7 +1182,8 @@ void __init debug_objects_mem_init(void) | |||
1184 | 1182 | ||
1185 | obj_cache = kmem_cache_create("debug_objects_cache", | 1183 | obj_cache = kmem_cache_create("debug_objects_cache", |
1186 | sizeof (struct debug_obj), 0, | 1184 | sizeof (struct debug_obj), 0, |
1187 | SLAB_DEBUG_OBJECTS, NULL); | 1185 | SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, |
1186 | NULL); | ||
1188 | 1187 | ||
1189 | if (!obj_cache || debug_objects_replace_static_objects()) { | 1188 | if (!obj_cache || debug_objects_replace_static_objects()) { |
1190 | debug_objects_enabled = 0; | 1189 | debug_objects_enabled = 0; |