• Vladimir Davydov's avatar
    memcg, slab: fix barrier usage when accessing memcg_caches · 959c8963
    Vladimir Davydov authored
    Each root kmem_cache has pointers to per-memcg caches stored in its
    memcg_params::memcg_caches array.  Whenever we want to allocate a slab
    for a memcg, we access this array to get per-memcg cache to allocate
    from (see memcg_kmem_get_cache()).  The access must be lock-free for
    performance reasons, so we should use barriers to assert the kmem_cache
    is up-to-date.
    
    First, we should place a write barrier immediately before setting the
    pointer to it in the memcg_caches array in order to make sure nobody
    will see a partially initialized object.  Second, we should issue a read
    barrier before dereferencing the pointer to conform to the write
    barrier.
    
    However, currently the barrier usage looks rather strange.  We have a
    write barrier *after* setting the pointer and a read barrier *before*
    reading the pointer, which is incorrect.  This patch fixes this.
    Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Glauber Costa <glommer@gmail.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Balbir Singh <bsingharora@gmail.com>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Christoph Lameter <cl@linux.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    959c8963
memcontrol.c 194 KB