• Vladimir Davydov's avatar
    memcg: zap memcg_slab_caches and memcg_slab_mutex · d5b3cf71
    Vladimir Davydov authored
    mem_cgroup->memcg_slab_caches is a list of kmem caches corresponding to
    the given cgroup.  Currently, it is only used on css free in order to
    destroy all caches corresponding to the memory cgroup being freed.  The
    list is protected by memcg_slab_mutex.  The mutex is also used to protect
    kmem_cache->memcg_params->memcg_caches arrays and synchronizes
    kmem_cache_destroy vs memcg_unregister_all_caches.
    
    However, we can perfectly get on without these two.  To destroy all caches
    corresponding to a memory cgroup, we can walk over the global list of kmem
    caches, slab_caches, and we can do all the synchronization stuff using the
    slab_mutex instead of the memcg_slab_mutex.  This patch therefore gets rid
    of the memcg_slab_caches and memcg_slab_mutex.
    
    Apart from this nice cleanup, it also:
    
     - assures that rcu_barrier() is called once at max when a root cache is
       destroyed or a memory cgroup is freed, no matter how many caches have
       SLAB_DESTROY_BY_RCU flag set;
    
     - fixes the race between kmem_cache_destroy and kmem_cache_create that
       exists, because memcg_cleanup_cache_params, which is called from
       kmem_cache_destroy after checking that kmem_cache->refcount=0,
       releases the slab_mutex, which gives kmem_cache_create a chance to
       make an alias to a cache doomed to be destroyed.
    Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@suse.cz>
    Acked-by: default avatarChristoph Lameter <cl@linux.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d5b3cf71
slab_common.c 26 KB