提交 7ffd4ca7 编写于 作者: J Johannes Weiner 提交者: Linus Torvalds

memcg: convert uncharge batching from bytes to page granularity

We never uncharge subpage quantities.
Signed-off-by: NJohannes Weiner <hannes@cmpxchg.org>
Acked-by: NKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 11c9ea4e
...@@ -1524,8 +1524,8 @@ struct task_struct { ...@@ -1524,8 +1524,8 @@ struct task_struct {
struct memcg_batch_info { struct memcg_batch_info {
int do_batch; /* incremented when batch uncharge started */ int do_batch; /* incremented when batch uncharge started */
struct mem_cgroup *memcg; /* target memcg of uncharge */ struct mem_cgroup *memcg; /* target memcg of uncharge */
unsigned long bytes; /* uncharged usage */ unsigned long nr_pages; /* uncharged usage */
unsigned long memsw_bytes; /* uncharged mem+swap usage */ unsigned long memsw_nr_pages; /* uncharged mem+swap usage */
} memcg_batch; } memcg_batch;
#endif #endif
}; };
......
...@@ -2579,9 +2579,9 @@ __do_uncharge(struct mem_cgroup *mem, const enum charge_type ctype, ...@@ -2579,9 +2579,9 @@ __do_uncharge(struct mem_cgroup *mem, const enum charge_type ctype,
if (batch->memcg != mem) if (batch->memcg != mem)
goto direct_uncharge; goto direct_uncharge;
/* remember freed charge and uncharge it later */ /* remember freed charge and uncharge it later */
batch->bytes += PAGE_SIZE; batch->nr_pages++;
if (uncharge_memsw) if (uncharge_memsw)
batch->memsw_bytes += PAGE_SIZE; batch->memsw_nr_pages++;
return; return;
direct_uncharge: direct_uncharge:
res_counter_uncharge(&mem->res, page_size); res_counter_uncharge(&mem->res, page_size);
...@@ -2708,8 +2708,8 @@ void mem_cgroup_uncharge_start(void) ...@@ -2708,8 +2708,8 @@ void mem_cgroup_uncharge_start(void)
/* We can do nest. */ /* We can do nest. */
if (current->memcg_batch.do_batch == 1) { if (current->memcg_batch.do_batch == 1) {
current->memcg_batch.memcg = NULL; current->memcg_batch.memcg = NULL;
current->memcg_batch.bytes = 0; current->memcg_batch.nr_pages = 0;
current->memcg_batch.memsw_bytes = 0; current->memcg_batch.memsw_nr_pages = 0;
} }
} }
...@@ -2730,10 +2730,12 @@ void mem_cgroup_uncharge_end(void) ...@@ -2730,10 +2730,12 @@ void mem_cgroup_uncharge_end(void)
* This "batch->memcg" is valid without any css_get/put etc... * This "batch->memcg" is valid without any css_get/put etc...
* bacause we hide charges behind us. * bacause we hide charges behind us.
*/ */
if (batch->bytes) if (batch->nr_pages)
res_counter_uncharge(&batch->memcg->res, batch->bytes); res_counter_uncharge(&batch->memcg->res,
if (batch->memsw_bytes) batch->nr_pages * PAGE_SIZE);
res_counter_uncharge(&batch->memcg->memsw, batch->memsw_bytes); if (batch->memsw_nr_pages)
res_counter_uncharge(&batch->memcg->memsw,
batch->memsw_nr_pages * PAGE_SIZE);
memcg_oom_recover(batch->memcg); memcg_oom_recover(batch->memcg);
/* forget this pointer (for sanity check) */ /* forget this pointer (for sanity check) */
batch->memcg = NULL; batch->memcg = NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册