Messages in this thread Patch in this message | | | Date | Thu, 27 Jan 2011 10:43:39 +0900 | From | KAMEZAWA Hiroyuki <> | Subject | [BUGFIX v2] memcg: fix res_counter_read_u64 lock aware (Was Re: [PATCH] oom: handle overflow in mem_cgroup_out_of_memory() |
| |
Thank you for advices. This version doesn't use inlined function and adds no overhead in 64bit.
Info: res_counter_read_u64 is not frequently called in memcontrol.c now. It's called at user-interface and interaction with other components. This addition of lock will not add any performance troubles.
== res_counter_read_u64 reads u64 value without lock. It's dangerous in 32bit environment. This patch adds lock.
Changelog: - handle 32/64 bit in other funciton - avoid unnecessary inlining.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> --- kernel/res_counter.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
Index: mmotm-0125/kernel/res_counter.c =================================================================== --- mmotm-0125.orig/kernel/res_counter.c +++ mmotm-0125/kernel/res_counter.c @@ -126,10 +126,24 @@ ssize_t res_counter_read(struct res_coun pos, buf, s - buf); } +#if BITS_PER_LONG == 32 +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_member(counter, member); + spin_unlock_irqrestore(&counter->lock, flags); + + return ret; +} +#else u64 res_counter_read_u64(struct res_counter *counter, int member) { return *res_counter_member(counter, member); } +#endif int res_counter_memparse_write_strategy(const char *buf, unsigned long long *res)
| |