As we don't account the swap stat number for the root_mem_cgroup anymore, here we can just return an invalid CSS ID if there is no non-root memcg is alive. Also, introduce memsw_accounting_users to track the number of active non-root memcgs. Signed-off-by: Jie Liu <jeff.liu@xxxxxxxxxx> CC: Glauber Costa <glommer@xxxxxxxxxxxxx> CC: Michal Hocko <mhocko@xxxxxxx> CC: Kamezawa Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> CC: Johannes Weiner <hannes@xxxxxxxxxxx> CC: Mel Gorman <mgorman@xxxxxxx> CC: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> CC: Sha Zhengju <handai.szj@xxxxxxxxxx> --- mm/page_cgroup.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index c945254..189fbf5 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c @@ -336,6 +336,8 @@ struct swap_cgroup { }; #define SC_PER_PAGE (PAGE_SIZE/sizeof(struct swap_cgroup)) +static atomic_t memsw_accounting_users = ATOMIC_INIT(0); + /* * SwapCgroup implements "lookup" and "exchange" operations. * In typical usage, this swap_cgroup is accessed via memcg's charge/uncharge @@ -389,6 +391,9 @@ static struct swap_cgroup *lookup_swap_cgroup(swp_entry_t ent, struct page *mappage; struct swap_cgroup *sc; + if (!atomic_read(&memsw_accounting_users)) + return NULL; + ctrl = &swap_cgroup_ctrl[swp_type(ent)]; if (ctrlp) *ctrlp = ctrl; @@ -416,6 +421,8 @@ unsigned short swap_cgroup_cmpxchg(swp_entry_t ent, unsigned short retval; sc = lookup_swap_cgroup(ent, &ctrl); + if (!sc) + return 0; spin_lock_irqsave(&ctrl->lock, flags); retval = sc->id; @@ -443,6 +450,8 @@ unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id) unsigned long flags; sc = lookup_swap_cgroup(ent, &ctrl); + if (!sc) + return 0; spin_lock_irqsave(&ctrl->lock, flags); old = sc->id; @@ -460,7 +469,9 @@ unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id) */ unsigned short lookup_swap_cgroup_id(swp_entry_t ent) { - return lookup_swap_cgroup(ent, NULL)->id; + struct swap_cgroup *sc = lookup_swap_cgroup(ent, NULL); + + return sc ? sc->id : 0; } int swap_cgroup_swapon(int type, unsigned long max_pages) @@ -471,6 +482,9 @@ int swap_cgroup_swapon(int type, unsigned long max_pages) if (!do_swap_account) return 0; + if (!atomic_read(&memsw_accounting_users)) + return 0; + length = DIV_ROUND_UP(max_pages, SC_PER_PAGE); ctrl = &swap_cgroup_ctrl[type]; -- 1.7.9.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>