Re: how to make memory.memsw.failcnt is nonzero
From: Peng Haitao <hidden>
Date: 2012-01-06 09:47:20
Also in:
linux-mm, lkml
Michal Hocko said the following on 2012-1-4 0:04:
quoted
# echo 15M > memory.memsw.limit_in_bytes # dd if=/dev/zero of=/tmp/temp_file count=20 bs=1M Killed # grep "failcnt" /var/log/messages | tail -2 Dec 28 17:08:45 K-test kernel: memory: usage 10240kB, limit 10240kB, failcnt 86 Dec 28 17:08:45 K-test kernel: memory+swap: usage 10240kB, limit 15360kB, failcnt 0 # cat memory.memsw.failcnt 0 The limit is 15M, but memory+swap usage also is 10M. I think memory+swap usage should be 15M and memsw.failcnt should be nonzero.So there is almost 10M of page cache that we can simply reclaim. If we use 40M limit then we are OK. So this looks like the small limit somehow tricks our math in the reclaim path and we think there is nothing to reclaim. I will look into this.
Thanks for you reply.
If there is something wrong, I think the bug will be in mem_cgroup_do_charge()
of mm/memcontrol.c
2210 ret = res_counter_charge(&memcg->res, csize, &fail_res);
2211
2212 if (likely(!ret)) {
2213 if (!do_swap_account)
2214 return CHARGE_OK;
2215 ret = res_counter_charge(&memcg->memsw, csize, &fail_res);
2216 if (likely(!ret))
2217 return CHARGE_OK;
2218
2219 res_counter_uncharge(&memcg->res, csize);
2220 mem_over_limit = mem_cgroup_from_res_counter(fail_res, memsw);
2221 flags |= MEM_CGROUP_RECLAIM_NOSWAP;
2222 } else
2223 mem_over_limit = mem_cgroup_from_res_counter(fail_res, res);
When hit memory.limit_in_bytes, res_counter_charge() will return -ENOMEM,
this will execute line 2222: } else.
But I think when hit memory.limit_in_bytes, the function should determine further
to memory.memsw.limit_in_bytes.
This think is OK?
--
Best Regards,
Peng