From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> memory cgroup adds a css-refcnt per a page and we decrement it at uncharge(). Now, we do uncharge in batch if possible. So, css_put() can be called in batch. This patch reduces the call of atomic_dec() and make memcg faster on smp system. And we need small modification for SWAPOUT routine. Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> --- mm/memcontrol.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) Index: mmotm-2.6.34-May21/mm/memcontrol.c =================================================================== --- mmotm-2.6.34-May21.orig/mm/memcontrol.c +++ mmotm-2.6.34-May21/mm/memcontrol.c @@ -2304,6 +2304,7 @@ direct_uncharge: res_counter_uncharge(&mem->memsw, PAGE_SIZE); if (unlikely(batch->memcg != mem)) memcg_oom_recover(mem); + css_put(&mem->css); return; } @@ -2373,9 +2374,6 @@ __mem_cgroup_uncharge_common(struct page unlock_page_cgroup(pc); memcg_check_events(mem, page); - /* at swapout, this memcg will be accessed to record to swap */ - if (ctype != MEM_CGROUP_CHARGE_TYPE_SWAPOUT) - css_put(&mem->css); return mem; @@ -2441,6 +2439,7 @@ void mem_cgroup_uncharge_end(void) res_counter_uncharge(&batch->memcg->res, batch->bytes); if (batch->memsw_bytes) res_counter_uncharge(&batch->memcg->memsw, batch->memsw_bytes); + __css_put(&batch->memcg->css, batch->bytes/PAGE_SIZE); memcg_oom_recover(batch->memcg); /* forget this pointer (for sanity check) */ batch->memcg = NULL; @@ -2456,19 +2455,22 @@ mem_cgroup_uncharge_swapcache(struct pag { struct mem_cgroup *memcg; int ctype = MEM_CGROUP_CHARGE_TYPE_SWAPOUT; + struct mem_cgroup *keep = NULL; if (!swapout) /* this was a swap cache but the swap is unused ! */ ctype = MEM_CGROUP_CHARGE_TYPE_DROP; + else + keep = try_get_mem_cgroup_from_page(page); memcg = __mem_cgroup_uncharge_common(page, ctype); /* record memcg information */ - if (do_swap_account && swapout && memcg) { + if (do_swap_account && swapout && memcg && keep == memcg) { swap_cgroup_record(ent, css_id(&memcg->css)); mem_cgroup_get(memcg); } - if (swapout && memcg) - css_put(&memcg->css); + if (keep) + css_put(&keep->css); } #endif -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>