On Thu, 27 Jan 2011 09:24:34 +0900 KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> wrote: > > > I'll review. Against the roll-over, I think we just need to take lock. > So, res_counter_read_u64() implementation was wrong. It should take lock. > Please give me time. > As far as I can see usages of return value of res_counter_read_u64() in memcontrol.c, all values are handle in u64 and no >> PAGE_SHIFT to 'int' is not done. I'll see usage of u64 return value to functions in other files from memcontrol.c But, at least, this patch is required, I think. There are races. == res_counter_read_u64 reads u64 value without lock. It's dangerous in 32bit environment. This patch adds lock. Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> --- include/linux/res_counter.h | 13 ++++++++++++- kernel/res_counter.c | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) Index: mmotm-0125/include/linux/res_counter.h =================================================================== --- mmotm-0125.orig/include/linux/res_counter.h +++ mmotm-0125/include/linux/res_counter.h @@ -68,7 +68,18 @@ struct res_counter { * @pos: and the offset. */ -u64 res_counter_read_u64(struct res_counter *counter, int member); +u64 res_counter_read_u64_locked(struct res_counter *counter, int member); + +static inline u64 res_counter_read_u64(struct res_counter *counter, int member) +{ + unsigned long flags; + u64 ret; + + spin_lock_irqsave(&counter->lock, flags); + ret = res_counter_read_u64_locked(counter, member); + spin_unlock_irqrestore(&counter->lock, flags); + return ret; +} ssize_t res_counter_read(struct res_counter *counter, int member, const char __user *buf, size_t nbytes, loff_t *pos, Index: mmotm-0125/kernel/res_counter.c =================================================================== --- mmotm-0125.orig/kernel/res_counter.c +++ mmotm-0125/kernel/res_counter.c @@ -126,7 +126,7 @@ ssize_t res_counter_read(struct res_coun pos, buf, s - buf); } -u64 res_counter_read_u64(struct res_counter *counter, int member) +u64 res_counter_read_u64_locked(struct res_counter *counter, int member) { return *res_counter_member(counter, member); } -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>