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.
Showing the changes to lib/debugobjects.c (1 of 1 file). Show all
Unified · Split
| @@ -135,7 +135,6 @@ static void fill_pool(void) · 134 unmodified lines | ||
| 135 | 135 | if (!new) |
| 136 | 136 | return; |
| 137 | 137 | |
| 138 | − kmemleak_ignore(new); | |
| 139 | 138 | raw_spin_lock_irqsave(&pool_lock, flags); |
| 140 | 139 | hlist_add_head(&new->node, &obj_pool); |
| 141 | 140 | debug_objects_allocated++; |
| @@ -1128,7 +1127,6 @@ static int __init debug_objects_replace_static_objects(void) · 986 unmodified lines | ||
| 1128 | 1127 | obj = kmem_cache_zalloc(obj_cache, GFP_KERNEL); |
| 1129 | 1128 | if (!obj) |
| 1130 | 1129 | goto free; |
| 1131 | − kmemleak_ignore(obj); | |
| 1132 | 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 | 1183 | obj_cache = kmem_cache_create("debug_objects_cache", |
| 1186 | 1184 | sizeof (struct debug_obj), 0, |
| 1187 | − SLAB_DEBUG_OBJECTS, NULL); | |
| 1185 | + SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, | |
| 1186 | + NULL); | |
| 1188 | 1187 | |
| 1189 | 1188 | if (!obj_cache || debug_objects_replace_static_objects()) { |
| 1190 | 1189 | debug_objects_enabled = 0; |