diff options
author | Johannes Weiner <hannes@cmpxchg.org> | 2011-03-23 19:42:26 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-23 22:46:26 -0400 |
commit | ad324e94475a04cfcdfdb11ad20f8ea81268e411 (patch) | |
tree | 4326bb602a3528071ffd6f3030c3a82c76a3454e /mm | |
parent | f212ad7cf9c73f8a7fa160e223dcb3f074441a72 (diff) |
memcg: no uncharged pages reach page_cgroup_zoneinfo
This patch series removes the direct page pointer from struct page_cgroup,
which saves 20% of per-page memcg memory overhead (Fedora and Ubuntu
enable memcg per default, openSUSE apparently too).
The node id or section number is encoded in the remaining free bits of
pc->flags which allows calculating the corresponding page without the
extra pointer.
I ran, what I think is, a worst-case microbenchmark that just cats a large
sparse file to /dev/null, because it means that walking the LRU list on
behalf of per-cgroup reclaim and looking up pages from page_cgroups is
happening constantly and at a high rate. But it made no measurable
difference. A profile reported a 0.11% share of the new
lookup_cgroup_page() function in this benchmark.
This patch:
All callsites check PCG_USED before passing pc->mem_cgroup, so the latter
is never NULL.
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memcontrol.c | 3 |
1 files changed, 0 insertions, 3 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 0356cb6c9504..5f7b0e1d789c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -370,9 +370,6 @@ page_cgroup_zoneinfo(struct page_cgroup *pc) | |||
370 | int nid = page_cgroup_nid(pc); | 370 | int nid = page_cgroup_nid(pc); |
371 | int zid = page_cgroup_zid(pc); | 371 | int zid = page_cgroup_zid(pc); |
372 | 372 | ||
373 | if (!mem) | ||
374 | return NULL; | ||
375 | |||
376 | return mem_cgroup_zoneinfo(mem, nid, zid); | 373 | return mem_cgroup_zoneinfo(mem, nid, zid); |
377 | } | 374 | } |
378 | 375 | ||