public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched: Fix 32bit race in sched_clock_remote()
@ 2013-04-05 16:36 Peter Zijlstra
  2013-04-08 21:16 ` Steven Rostedt
  2013-04-09 14:55 ` Yong Zhang
  0 siblings, 2 replies; 4+ messages in thread
From: Peter Zijlstra @ 2013-04-05 16:36 UTC (permalink / raw)
  To: tglx, Steven Rostedt, mingo; +Cc: LKML

Thomas spotted a nasty 32bit race in sched_clock_remote() after way too
many hours of debugging weirdness.

What happens is that sched_clock_remote() does regular machine word
reads of sched_clock_data::clock; this appears safe since we use
cmpxchg64() to update the variable and any half-read value would
trigger a retry.

Except we don't validate the new value 'val' in the same way! Thus we
can propagate non-atomic read errors into the clock value.

Cc: Ingo Molnar <mingo@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Debugged-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
 kernel/sched/clock.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/clock.c b/kernel/sched/clock.c
index c685e31..7042ef7 100644
--- a/kernel/sched/clock.c
+++ b/kernel/sched/clock.c
@@ -170,6 +170,21 @@ static u64 sched_clock_local(struct sched_clock_data *scd)
 	return clock;
 }
 
+#ifndef CONFIG_64BIT
+/*
+ * 32bit machines can't atomically read a u64 except using cmpxchg64()
+ */
+static inline u64 scd_read_clock(struct sched_clock_data *scd)
+{
+	return cmpxchg64(&scd->clock, 0, 0);
+}
+#else
+static inline u64 scd_read_clock(struct sched_clock_data *scd)
+{
+	return scd->clock;
+}
+#endif
+
 static u64 sched_clock_remote(struct sched_clock_data *scd)
 {
 	struct sched_clock_data *my_scd = this_scd();
@@ -178,8 +193,8 @@ static u64 sched_clock_remote(struct sched_clock_data *scd)
 
 	sched_clock_local(my_scd);
 again:
-	this_clock = my_scd->clock;
-	remote_clock = scd->clock;
+	this_clock = scd_clock_read(my_scd);
+	remote_clock = scd_clock_read(scd);
 
 	/*
 	 * Use the opportunity that we have both locks



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

end of thread, other threads:[~2013-04-10  7:14 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-05 16:36 [PATCH] sched: Fix 32bit race in sched_clock_remote() Peter Zijlstra
2013-04-08 21:16 ` Steven Rostedt
2013-04-09 14:55 ` Yong Zhang
2013-04-10  7:14   ` Peter Zijlstra

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