Memory controller use rcu_read_lock() in mem_cgroup_cache_charge()
Subsystems (2)
PATCH 1/1 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 <[email protected]>
---
mm/memcontrol.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
mm/memcontrol.c renamed from mm/memcontrol.c~memory-controller-use-rcu-lead-lock +7 -3
@@ -717,16 +717,20 @@ int mem_cgroup_charge(struct page *page,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; }/*
_
Signature · 4 lines
Warm Regards, Balbir Singh Linux Technology Center IBM, ISTL
Quoted 39 lines · On Thu, 20 Dec 2007 14:31:52 +0530 Balbir Singh <[email protected]>…
Hugh Dickins noticed that we were using
rcu_dereference()withoutrcu_read_lock()in the cache charging routine. The patch below fixes this problemSigned-off-by Balbir Singh <[email protected]>---
mm/memcontrol.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)diff -puN
mm/memcontrol.c~memory-controller-use-rcu-lead-lockmm/memcontrol.cmm/memcontrol.c renamed from mm/memcontrol.c~memory-controller-use-rcu-lead-lock +7
-3@@ -717,16 +717,20 @@ int mem_cgroup_charge(struct page *page,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; }/*
Quoted 1 line
_
Seems reasonable to me.
Thanks,
-Kame