memcg: convert uncharge batching from bytes to page granularity
We never uncharge subpage quantities. 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> Cc: Balbir Singh <balbir@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
11c9ea4e80
commit
7ffd4ca7a2
@ -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,
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
* 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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user