Skip to content

Commit

Permalink
memcg: avoid overflow caused by PAGE_ALIGN
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sha Zhengju authored and Linus Torvalds committed Sep 12, 2013
1 parent 6de5a8b commit 3af3351
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion kernel/res_counter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

0 comments on commit 3af3351

Please sign in to comment.