• Michal Hocko's avatar
    memcg: fix css reference leak and endless loop in mem_cgroup_iter · 0eef6156
    Michal Hocko authored
    Commit 19f39402 ("memcg: simplify mem_cgroup_iter") has reorganized
    mem_cgroup_iter code in order to simplify it.  A part of that change was
    dropping an optimization which didn't call css_tryget on the root of the
    walked tree.  The patch however didn't change the css_put part in
    mem_cgroup_iter which excludes root.
    
    This wasn't an issue at the time because __mem_cgroup_iter_next bailed
    out for root early without taking a reference as cgroup iterators
    (css_next_descendant_pre) didn't visit root themselves.
    
    Nevertheless cgroup iterators have been reworked to visit root by commit
    bd8815a6 ("cgroup: make css_for_each_descendant() and friends
    include the origin css in the iteration") when the root bypass have been
    dropped in __mem_cgroup_iter_next.  This means that css_put is not
    called for root and so css along with mem_cgroup and other cgroup
    internal object tied by css lifetime are never freed.
    
    Fix the issue by reintroducing root check in __mem_cgroup_iter_next and
    do not take css reference for it.
    
    This reference counting magic protects us also from another issue, an
    endless loop reported by Hugh Dickins when reclaim races with root
    removal and css_tryget called by iterator internally would fail.  There
    would be no other nodes to visit so __mem_cgroup_iter_next would return
    NULL and mem_cgroup_iter would interpret it as "start looping from root
    again" and so mem_cgroup_iter would loop forever internally.
    Signed-off-by: default avatarMichal Hocko <mhocko@suse.cz>
    Reported-by: default avatarHugh Dickins <hughd@google.com>
    Tested-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: <stable@vger.kernel.org>	[3.12+]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    0eef6156
memcontrol.c 194 KB