Memory controller use rcu_read_lock() in mem_cgroup_cache_charge()
Hugh Dickins noticed that we were using rcu_dereference() without rcu_read_lock() in the cache charging routine. The patch below fixes this problem Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Hugh Dickins <hugh@veritas.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
217bc3194d
commit
ac44d354d5
@ -456,16 +456,20 @@ int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
|
||||
int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask)
|
||||
{
|
||||
int ret = 0;
|
||||
struct mem_cgroup *mem;
|
||||
if (!mm)
|
||||
mm = &init_mm;
|
||||
|
||||
rcu_read_lock();
|
||||
mem = rcu_dereference(mm->mem_cgroup);
|
||||
css_get(&mem->css);
|
||||
rcu_read_unlock();
|
||||
if (mem->control_type == MEM_CGROUP_TYPE_ALL)
|
||||
return mem_cgroup_charge_common(page, mm, gfp_mask,
|
||||
ret = mem_cgroup_charge_common(page, mm, gfp_mask,
|
||||
MEM_CGROUP_CHARGE_TYPE_CACHE);
|
||||
else
|
||||
return 0;
|
||||
css_put(&mem->css);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user