On 7/29/26 7:18 PM, Li Xiasong wrote: > 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 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. Ouch, good catch! > The affected window is: > > slab_debugfs_init() > slab_debugfs_root = debugfs_create_dir(...) > list_for_each_entry(s, &slab_caches, list) > debugfs_slab_add(s) > > kmem_cache_create(..., SLAB_STORE_USER, ...) > do_kmem_cache_create() > if (slab_state <= UP) > return without debugfs entries > > slab_sysfs_init() > slab_state = FULL > > Initialize the debugfs root and add debugfs entries while holding > slab_mutex, walking slab_caches exactly once and handling both sysfs > and debugfs entries in the same pass. This gives the sysfs and debugfs > initialization an explicit order and prevents caches from being > created between the debugfs scan and slab_state reaching FULL. > > Gate the new slab_late_init() on either sysfs or debugfs being enabled, > with the slab_kset creation and alias_list processing factored into > helpers that have empty no-sysfs variants, as suggested by Vlastimil > Babka. On slab_kset_init() failure, slab_state stays below FULL so > kmem_cache_create() keeps taking the early-boot path, matching prior > behavior. > > Guard debugfs_slab_release() against an uninitialized debugfs root, > since the root is now created later and a cache may be released before > it exists. > > Fixes: 1a5ad30b89b4 ("mm: slub: make slab_sysfs_init() a late_initcall") > Cc: stable@vger.kernel.org > Suggested-by: Vlastimil Babka > Signed-off-by: Li Xiasong > --- Looks good to me, Reviewed-by: Harry Yoo (Oracle) -- Cheers, Harry / Hyeonggon