• Miles Chen's avatar
    slub: fix sysfs duplicate filename creation when slub_debug=O · 11066386
    Miles Chen authored
    When slub_debug=O is set.  It is possible to clear debug flags for an
    "unmergeable" slab cache in kmem_cache_open().  It makes the "unmergeable"
    cache became "mergeable" in sysfs_slab_add().
    
    These caches will generate their "unique IDs" by create_unique_id(), but
    it is possible to create identical unique IDs.  In my experiment,
    sgpool-128, names_cache, biovec-256 generate the same ID ":Ft-0004096" and
    the kernel reports "sysfs: cannot create duplicate filename
    '/kernel/slab/:Ft-0004096'".
    
    To repeat my experiment, set disable_higher_order_debug=1,
    CONFIG_SLUB_DEBUG_ON=y in kernel-4.14.
    
    Fix this issue by setting unmergeable=1 if slub_debug=O and the the
    default slub_debug contains any no-merge flags.
    
    call path:
    kmem_cache_create()
      __kmem_cache_alias()	-> we set SLAB_NEVER_MERGE flags here
      create_cache()
        __kmem_cache_create()
          kmem_cache_open()	-> clear DEBUG_METADATA_FLAGS
          sysfs_slab_add()	-> the slab cache is mergeable now
    
      sysfs: cannot create duplicate filename '/kernel/slab/:Ft-0004096'
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 1 at fs/sysfs/dir.c:31 sysfs_warn_dup+0x60/0x7c
      Modules linked in:
      CPU: 0 PID: 1 Comm: swapper/0 Tainted: G        W       4.14.0-rc7ajb-00131-gd4c2e9fc-dirty #123
      Hardware name: linux,dummy-virt (DT)
      task: ffffffc07d4e0080 task.stack: ffffff8008008000
      PC is at sysfs_warn_dup+0x60/0x7c
      LR is at sysfs_warn_dup+0x60/0x7c
      pc :  lr :  pstate: 60000145
      Call trace:
       sysfs_warn_dup+0x60/0x7c
       sysfs_create_dir_ns+0x98/0xa0
       kobject_add_internal+0xa0/0x294
       kobject_init_and_add+0x90/0xb4
       sysfs_slab_add+0x90/0x200
       __kmem_cache_create+0x26c/0x438
       kmem_cache_create+0x164/0x1f4
       sg_pool_init+0x60/0x100
       do_one_initcall+0x38/0x12c
       kernel_init_freeable+0x138/0x1d4
       kernel_init+0x10/0xfc
       ret_from_fork+0x10/0x18
    
    Link: http://lkml.kernel.org/r/1510365805-5155-1-git-send-email-miles.chen@mediatek.com
    
    Signed-off-by: default avatarMiles Chen <miles.chen@mediatek.com>
    Acked-by: default avatarChristoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    11066386