summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSha Zhengju <handai.szj@taobao.com>2013-09-12 15:13:48 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-12 15:38:02 -0700
commit3af3351676c3deecfd632f47719fb0d13a061ba8 (patch)
tree5374b3e010b49c9cec6f45e486bc7e3a3d205022
parent6de5a8bfcae6e3b427d642eff078d8305b324b52 (diff)
memcg: avoid overflow caused by PAGE_ALIGN
Since PAGE_ALIGN is aligning up(the next page boundary), so after PAGE_ALIGN, the value might be overflow, such as write the MAX value to *.limit_in_bytes. $ cat /cgroup/memory/memory.limit_in_bytes 18446744073709551615 # echo 18446744073709551615 > /cgroup/memory/memory.limit_in_bytes bash: echo: write error: Invalid argument Some user programs might depend on such behaviours(like libcg, we read the value in snapshot, then use the value to reset cgroup later), and that will cause confusion. So we need to fix it. Signed-off-by: Sha Zhengju <handai.szj@taobao.com> Signed-off-by: Qiang Huang <h.huangqiang@huawei.com> Acked-by: Michal Hocko <mhocko@suse.cz> Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Cc: Jeff Liu <jeff.liu@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--kernel/res_counter.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/res_counter.c b/kernel/res_counter.c
index 3f0417f97e76..085d3ae478fe 100644
--- a/kernel/res_counter.c
+++ b/kernel/res_counter.c
@@ -195,6 +195,10 @@ int res_counter_memparse_write_strategy(const char *buf,
if (*end != '\0')
return -EINVAL;
- *res = PAGE_ALIGN(*res);
+ if (PAGE_ALIGN(*res) >= *res)
+ *res = PAGE_ALIGN(*res);
+ else
+ *res = RES_COUNTER_MAX;
+
return 0;
}