• Sha Zhengju's avatar
    memcg: add per cgroup writeback pages accounting · 3ea67d06
    Sha Zhengju authored
    Add memcg routines to count writeback pages, later dirty pages will also
    be accounted.
    
    After Kame's commit 89c06bd5 ("memcg: use new logic for page stat
    accounting"), we can use 'struct page' flag to test page state instead
    of per page_cgroup flag.  But memcg has a feature to move a page from a
    cgroup to another one and may have race between "move" and "page stat
    accounting".  So in order to avoid the race we have designed a new lock:
    
             mem_cgroup_begin_update_page_stat()
             modify page information        -->(a)
             mem_cgroup_update_page_stat()  -->(b)
             mem_cgroup_end_update_page_stat()
    
    It requires both (a) and (b)(writeback pages accounting) to be pretected
    in mem_cgroup_{begin/end}_update_page_stat().  It's full no-op for
    !CONFIG_MEMCG, almost no-op if memcg is disabled (but compiled in), rcu
    read lock in the most cases (no task is moving), and spin_lock_irqsave
    on top in the slow path.
    
    There're two writeback interfaces to modify: test_{clear/set}_page_writeback().
    And the lock order is:
    	--> memcg->move_lock
    	  --> mapping->tree_lock
    Signed-off-by: default avatarSha Zhengju <handai.szj@taobao.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
    Reviewed-by: default avatarGreg Thelen <gthelen@google.com>
    Cc: Fengguang Wu <fengguang.wu@intel.com>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3ea67d06
memcontrol.c 182 KB