Skip to content
  • Vladimir Davydov's avatar
    memcg, slab: do not destroy children caches if parent has aliases · b8529907
    Vladimir Davydov authored
    
    
    Currently we destroy children caches at the very beginning of
    kmem_cache_destroy().  This is wrong, because the root cache will not
    necessarily be destroyed in the end - if it has aliases (refcount > 0),
    kmem_cache_destroy() will simply decrement its refcount and return.  In
    this case, at best we will get a bunch of warnings in dmesg, like this
    one:
    
      kmem_cache_destroy kmalloc-32:0: Slab cache still has objects
      CPU: 1 PID: 7139 Comm: modprobe Tainted: G    B   W    3.13.0+ #117
      Call Trace:
        dump_stack+0x49/0x5b
        kmem_cache_destroy+0xdf/0xf0
        kmem_cache_destroy_memcg_children+0x97/0xc0
        kmem_cache_destroy+0xf/0xf0
        xfs_mru_cache_uninit+0x21/0x30 [xfs]
        exit_xfs_fs+0x2e/0xc44 [xfs]
        SyS_delete_module+0x198/0x1f0
        system_call_fastpath+0x16/0x1b
    
    At worst - if kmem_cache_destroy() will race with an allocation from a
    memcg cache - the kernel will panic.
    
    This patch fixes this by moving children caches destruction after the
    check if the cache has aliases.  Plus, it forbids destroying a root
    cache if it still has children caches, because each children cache keeps
    a reference to its parent.
    
    Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Glauber Costa <glommer@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b8529907