public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH -tip] cpuacct: Make cpuacct hierarchy walk in cpuacct_charge() safe when rcupreempt is used.
@ 2009-03-17  6:17 Bharata B Rao
  2009-03-17  6:28 ` Li Zefan
  0 siblings, 1 reply; 20+ messages in thread
From: Bharata B Rao @ 2009-03-17  6:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: Dhaval Giani, Balbir Singh, Li Zefan, Paul Menage, Ingo Molnar,
	Peter Zijlstra, KAMEZAWA Hiroyuki

cpuacct: Make cpuacct hierarchy walk in cpuacct_charge() safe when
	rcupreempt is used.

cpuacct_charge() obtains task's ca and does a hierarchy walk upwards.
This can race with the task's movement between cgroups. This race
can cause an access to freed ca pointer in cpuacct_charge(). This will not
happen with rcu or tree rcu as cpuacct_charge() is called with preemption
disabled. However if rcupreempt is used, the race still exists. Thanks to
Li Zefan for explaining this.

Fix this race by explicitly protecting ca and the hierarchy walk with
rcu_read_lock().

Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
---
 kernel/sched.c |    8 ++++++++
 1 file changed, 8 insertions(+)

--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -9891,6 +9891,13 @@ static void cpuacct_charge(struct task_s
 		return;
 
 	cpu = task_cpu(tsk);
+
+	/*
+	 * preemption is already disabled here, but to be safe with
+	 * rcupreempt, take rcu_read_lock(). This protects ca and
+	 * hence the hierarchy walk.
+	 */
+	rcu_read_lock();
 	ca = task_ca(tsk);
 
 	do {
@@ -9898,6 +9905,7 @@ static void cpuacct_charge(struct task_s
 		*cpuusage += cputime;
 		ca = ca->parent;
 	} while (ca);
+	rcu_read_unlock();
 }
 
 struct cgroup_subsys cpuacct_subsys = {

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2009-03-19  9:43 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-17  6:17 [PATCH -tip] cpuacct: Make cpuacct hierarchy walk in cpuacct_charge() safe when rcupreempt is used Bharata B Rao
2009-03-17  6:28 ` Li Zefan
2009-03-17  7:36   ` Bharata B Rao
2009-03-17 13:12     ` Balbir Singh
2009-03-17 13:26       ` Peter Zijlstra
2009-03-17 13:59         ` Balbir Singh
2009-03-17 14:04           ` Peter Zijlstra
2009-03-18  3:25             ` Bharata B Rao
2009-03-18  3:54               ` KAMEZAWA Hiroyuki
2009-03-18  4:48                 ` Bharata B Rao
2009-03-18  7:08                   ` KAMEZAWA Hiroyuki
2009-03-18  8:05                     ` Bharata B Rao
2009-03-17 23:59         ` KAMEZAWA Hiroyuki
2009-03-18  3:18       ` Bharata B Rao
2009-03-18  9:36         ` Balbir Singh
2009-03-19  9:20     ` Peter Zijlstra
2009-03-19  9:43       ` Bharata B Rao
2009-03-17 12:40   ` Balbir Singh
2009-03-18  1:40     ` Li Zefan
2009-03-18  2:59       ` Balbir Singh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox