slab_debugfs_init() creates the slab debugfs root at device initcall time, while slab_sysfs_init() moves slab_state to FULL at late initcall time. SLAB_STORE_USER caches created in this window currently miss their debugfs entries because do_kmem_cache_create() skips debugfs_slab_add() when slab_state <= UP. This was observed with MPTCP's request_sock_subflow_v6 cache, whose slab debugfs directory was missing. The affected initcall window is: slab_debugfs_init() slab_debugfs_root = debugfs_create_dir(...) kmem_cache_create(..., SLAB_STORE_USER, ...) do_kmem_cache_create() if (slab_state <= UP) return without debugfs entries slab_sysfs_init() slab_state = FULL Run slab_debugfs_init() after slab_sysfs_init() and protect its scan of slab_caches with slab_mutex. Fixes: 1a5ad30b89b4 ("mm: slub: make slab_sysfs_init() a late_initcall") Signed-off-by: Li Xiasong --- mm/slub.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mm/slub.c b/mm/slub.c index 9ec774dc7009..d35e40c7a7ba 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -9992,16 +9992,23 @@ static int __init slab_debugfs_init(void) { struct kmem_cache *s; + mutex_lock(&slab_mutex); + slab_debugfs_root = debugfs_create_dir("slab", NULL); list_for_each_entry(s, &slab_caches, list) if (s->flags & SLAB_STORE_USER) debugfs_slab_add(s); + mutex_unlock(&slab_mutex); return 0; } -__initcall(slab_debugfs_init); +/* + * This must be after slab_sysfs_init(), otherwise caches created between + * the debugfs scan and slab_state reaching FULL miss their debugfs entries. + */ +late_initcall(slab_debugfs_init); #endif /* * The /proc/slabinfo ABI -- 2.34.1