• T
    memcg: convert mem_cgroup->under_oom from atomic_t to int · c2b42d3c
    Tejun Heo 提交于
    memcg->under_oom tracks whether the memcg is under OOM conditions and is
    an atomic_t counter managed with mem_cgroup_[un]mark_under_oom().  While
    atomic_t appears to be simple synchronization-wise, when used as a
    synchronization construct like here, it's trickier and more error-prone
    due to weak memory ordering rules, especially around atomic_read(), and
    false sense of security.
    
    For example, both non-trivial read sites of memcg->under_oom are a bit
    problematic although not being actually broken.
    
    * mem_cgroup_oom_register_event()
    
      It isn't explicit what guarantees the memory ordering between event
      addition and memcg->under_oom check.  This isn't broken only because
      memcg_oom_lock is used for both event list and memcg->oom_lock.
    
    * memcg_oom_recover()
    
      The lockless test doesn't have any explanation why this would be
      safe.
    
    mem_cgroup_[un]mark_under_oom() are very cold paths and there's no point
    in avoiding locking memcg_oom_lock there.  This patch converts
    memcg->under_oom from atomic_t to int, puts their modifications under
    memcg_oom_lock and documents why the lockless test in
    memcg_oom_recover() is safe.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Acked-by: NMichal Hocko <mhocko@suse.cz>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    c2b42d3c
memcontrol.c 149.8 KB