• Vladimir Davydov's avatar
    memcg: rework memcg_update_kmem_limit synchronization · d6441637
    Vladimir Davydov authored
    Currently we take both the memcg_create_mutex and the set_limit_mutex
    when we enable kmem accounting for a memory cgroup, which makes kmem
    activation events serialize with both memcg creations and other memcg
    limit updates (memory.limit, memory.memsw.limit).  However, there is no
    point in such strict synchronization rules there.
    
    First, the set_limit_mutex was introduced to keep the memory.limit and
    memory.memsw.limit values in sync.  Since memory.kmem.limit can be set
    independently of them, it is better to introduce a separate mutex to
    synchronize against concurrent kmem limit updates.
    
    Second, we take the memcg_create_mutex in order to make sure all
    children of this memcg will be kmem-active as well.  For achieving that,
    it is enough to hold this mutex only while checking if
    memcg_has_children() though.  This guarantees that if a child is added
    after we checked that the memcg has no children, the newly added cgroup
    will see its parent kmem-active (of course if the latter succeeded), and
    call kmem activation for itself.
    
    This patch simplifies the locking rules of memcg_update_kmem_limit()
    according to these considerations.
    
    [vdavydov@parallels.com: fix unintialized var warning]
    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>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d6441637
memcontrol.c 193 KB