memcg: res_counter_read_u64(): fix potential races on 32-bit machines
res_counter_read_u64 reads u64 value without lock. It's dangerous in a 32bit environment. Add locking. Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Greg Thelen <gthelen@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: David Rientjes <rientjes@google.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Minchan Kim <minchan.kim@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
61f2e7b0f4
commit
6c191cd01a
|
@ -126,10 +126,24 @@ ssize_t res_counter_read(struct res_counter *counter, int member,
|
|||
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)
|
||||
|
|
Loading…
Reference in New Issue