mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 14:19:16 +00:00
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
1 changed files with 7 additions and 3 deletions
|
@ -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,
|
int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
|
||||||
gfp_t gfp_mask)
|
gfp_t gfp_mask)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
struct mem_cgroup *mem;
|
struct mem_cgroup *mem;
|
||||||
if (!mm)
|
if (!mm)
|
||||||
mm = &init_mm;
|
mm = &init_mm;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
mem = rcu_dereference(mm->mem_cgroup);
|
mem = rcu_dereference(mm->mem_cgroup);
|
||||||
|
css_get(&mem->css);
|
||||||
|
rcu_read_unlock();
|
||||||
if (mem->control_type == MEM_CGROUP_TYPE_ALL)
|
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);
|
MEM_CGROUP_CHARGE_TYPE_CACHE);
|
||||||
else
|
css_put(&mem->css);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue