• Johannes Weiner's avatar
    mm: memcg: per-priority per-zone hierarchy scan generations · 527a5ec9
    Johannes Weiner authored
    Memory cgroup limit reclaim currently picks one memory cgroup out of the
    target hierarchy, remembers it as the last scanned child, and reclaims
    all zones in it with decreasing priority levels.
    
    The new hierarchy reclaim code will pick memory cgroups from the same
    hierarchy concurrently from different zones and priority levels, it
    becomes necessary that hierarchy roots not only remember the last
    scanned child, but do so for each zone and priority level.
    
    Until now, we reclaimed memcgs like this:
    
        mem = mem_cgroup_iter(root)
        for each priority level:
          for each zone in zonelist:
            reclaim(mem, zone)
    
    But subsequent patches will move the memcg iteration inside the loop
    over the zones:
    
        for each priority level:
          for each zone in zonelist:
            mem = mem_cgroup_iter(root)
            reclaim(mem, zone)
    
    And to keep with the original scan order - memcg -> priority -> zone -
    the last scanned memcg has to be remembered per zone and per priority
    level.
    
    Furthermore, global reclaim will be switched to the hierarchy walk as
    well.  Different from limit reclaim, which can just recheck the limit
    after some reclaim progress, its target is to scan all memcgs for the
    desired zone pages, proportional to the memcg size, and so reliably
    detecting a full hierarchy round-trip will become crucial.
    
    Currently, the code relies on one reclaimer encountering the same memcg
    twice, but that is error-prone with concurrent reclaimers.  Instead, use
    a generation counter that is increased every time the child with the
    highest ID has been visited, so that reclaimers can stop when the
    generation changes.
    Signed-off-by: default avatarJohannes Weiner <jweiner@redhat.com>
    Reviewed-by: default avatarKirill A. Shutemov <kirill@shutemov.name>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
    Cc: Balbir Singh <bsingharora@gmail.com>
    Cc: Ying Han <yinghan@google.com>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Minchan Kim <minchan.kim@gmail.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Hugh Dickins <hughd@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    527a5ec9
memcontrol.c 146 KB