History

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.

Qian Cai committed 7 years ago

Commit 8de456c1 parent dcf7fe91 file · +2 −3Browse files

Showing the changes to lib/debugobjects.c (1 of 1 file). Show all

Unified · Split

lib/debugobjects.c+2−3
@@ -135,7 +135,6 @@ static void fill_pool(void) · 134 unmodified lines
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) · 986 unmodified lines
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) · 49 unmodified lines
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;