'global' rq->clock (was Re: Horrendous Audio Stutter - current git)

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Peter Zijlstra
Date: Friday, May 2, 2008 - 12:56 pm

On Fri, 2008-05-02 at 21:27 +0200, Mike Galbraith wrote:

That's a quite horrible patch for some of us, but I think I know why you
did that, and I think your fancy Q6600 has a stable enough TSC to pull
it off.

Let me try and come up with something slightly less horrible


Ok, the the below would need something that relates tick_timestamp's to
one another.. probably sucks without it..

OTOH, Andi said he was working on a fastish global sched_clock() thingy,
Andi got a link to that code?

Index: linux-2.6-2/kernel/sched.c
===================================================================
--- linux-2.6-2.orig/kernel/sched.c
+++ linux-2.6-2/kernel/sched.c
@@ -560,6 +560,7 @@ struct rq {
 	unsigned long next_balance;
 	struct mm_struct *prev_mm;
 
+	spinlock_t clock_lock;
 	u64 clock, prev_clock_raw;
 	s64 clock_max_delta;
 
@@ -657,20 +658,25 @@ static inline void update_last_tick_seen
 }
 #endif
 
+#define cpu_rq(cpu)		(&per_cpu(runqueues, (cpu)))
+#define this_rq()		(&__get_cpu_var(runqueues))
+#define task_rq(p)		cpu_rq(task_cpu(p))
+#define cpu_curr(cpu)		(cpu_rq(cpu)->curr)
+
 /*
  * Update the per-runqueue clock, as finegrained as the platform can give
  * us, but without assuming monotonicity, etc.:
  */
-static void __update_rq_clock(struct rq *rq)
+static void ___update_rq_clock(struct rq *rq, u64 now)
 {
 	u64 prev_raw = rq->prev_clock_raw;
-	u64 now = sched_clock();
 	s64 delta = now - prev_raw;
 	u64 clock = rq->clock;
 
 #ifdef CONFIG_SCHED_DEBUG
 	WARN_ON_ONCE(cpu_of(rq) != smp_processor_id());
 #endif
+	spin_lock(&rq->clock_lock);
 	/*
 	 * Protect against sched_clock() occasionally going backwards:
 	 */
@@ -699,12 +705,31 @@ static void __update_rq_clock(struct rq 
 
 	rq->prev_clock_raw = now;
 	rq->clock = clock;
+	spin_unlock(&rq->clock_lock);
+}
+
+static void __update_rq_clock(struct rq *rq)
+{
+	___update_rq_clock(rq, sched_clock());
+}
+
+static void __update_remote_rq_clock(struct rq *rq)
+{
+	u64 now = sched_clock();
+	struct rq *this_rq = this_rq();
+
+	now -= this_rq->tick_timestamp;
+	now += rq->tick_timestamp;
+
+	___update_rq_clock(rq, now);
 }
 
 static void update_rq_clock(struct rq *rq)
 {
 	if (likely(smp_processor_id() == cpu_of(rq)))
 		__update_rq_clock(rq);
+	else
+		__update_remote_rq_clock(rq);
 }
 
 /*
@@ -717,11 +742,6 @@ static void update_rq_clock(struct rq *r
 #define for_each_domain(cpu, __sd) \
 	for (__sd = rcu_dereference(cpu_rq(cpu)->sd); __sd; __sd = __sd->parent)
 
-#define cpu_rq(cpu)		(&per_cpu(runqueues, (cpu)))
-#define this_rq()		(&__get_cpu_var(runqueues))
-#define task_rq(p)		cpu_rq(task_cpu(p))
-#define cpu_curr(cpu)		(cpu_rq(cpu)->curr)
-
 /*
  * Tunables that become constants when CONFIG_SCHED_DEBUG is off:
  */
@@ -8147,6 +8167,7 @@ void __init sched_init(void)
 
 		rq = cpu_rq(i);
 		spin_lock_init(&rq->lock);
+		spin_lock_init(&rq->clock_lock);
 		lockdep_set_class(&rq->lock, &rq->rq_lock_key);
 		rq->nr_running = 0;
 		rq->clock = 1;



--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Horrendous Audio Stutter - current git, Parag Warudkar, (Thu May 1, 5:14 pm)
Re: Horrendous Audio Stutter - current git, Peter Zijlstra, (Fri May 2, 1:34 am)
Re: 'global' rq->clock, Arjan van de Ven, (Fri May 2, 3:09 am)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Fri May 2, 3:32 am)
Re: Horrendous Audio Stutter - current git, Peter Zijlstra, (Fri May 2, 3:35 am)
Re: Horrendous Audio Stutter - current git, Peter Zijlstra, (Fri May 2, 4:08 am)
Re: Horrendous Audio Stutter - current git, Parag Warudkar, (Fri May 2, 4:10 am)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Fri May 2, 4:37 am)
Re: Horrendous Audio Stutter - current git, Peter Zijlstra, (Fri May 2, 4:39 am)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Fri May 2, 4:45 am)
Re: Horrendous Audio Stutter - current git, Peter Zijlstra, (Fri May 2, 4:51 am)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Fri May 2, 5:06 am)
Re: Horrendous Audio Stutter - current git, Mike Galbraith, (Fri May 2, 5:09 am)
Re: Horrendous Audio Stutter - current git, Parag Warudkar, (Fri May 2, 5:21 am)
Re: Horrendous Audio Stutter - current git, Parag Warudkar, (Fri May 2, 5:22 am)
Re: Horrendous Audio Stutter - current git, Mike Galbraith, (Fri May 2, 5:37 am)
Re: Horrendous Audio Stutter - current git, Dhaval Giani, (Fri May 2, 6:21 am)
Re: Horrendous Audio Stutter - current git, Mike Galbraith, (Fri May 2, 8:02 am)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Fri May 2, 8:49 am)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Fri May 2, 11:53 am)
Re: Horrendous Audio Stutter - current git, Mike Galbraith, (Fri May 2, 12:27 pm)
Re: Horrendous Audio Stutter - current git, Mike Galbraith, (Fri May 2, 12:38 pm)
'global' rq->clock (was Re: Horrendous Audio Stutter - cur ..., Peter Zijlstra, (Fri May 2, 12:56 pm)
Re: 'global' rq->clock, David Miller, (Fri May 2, 2:48 pm)
Re: 'global' rq->clock, David Miller, (Fri May 2, 3:00 pm)
Re: 'global' rq->clock, Peter Zijlstra, (Fri May 2, 3:07 pm)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Sat May 3, 12:13 am)
Re: Horrendous Audio Stutter - current git, Mike Galbraith, (Sat May 3, 12:39 am)
Re: 'global' rq->clock, Ingo Molnar, (Sat May 3, 1:28 am)
Re: 'global' rq->clock, David Miller, (Sat May 3, 2:05 am)
Re: 'global' rq->clock, Ingo Molnar, (Sat May 3, 3:10 am)
Re: 'global' rq->clock, David Miller, (Sat May 3, 12:27 pm)
Re: 'global' rq->clock, David Miller, (Sat May 3, 12:28 pm)
Re: 'global' rq->clock, Ingo Molnar, (Sat May 3, 12:37 pm)
Re: 'global' rq->clock, Ingo Molnar, (Sat May 3, 12:39 pm)
Re: 'global' rq->clock, Benjamin Herrenschmidt, (Sat May 3, 3:30 pm)
Re: 'global' rq->clock, Ingo Molnar, (Sat May 3, 3:38 pm)
Re: 'global' rq->clock, David Miller, (Sat May 3, 4:04 pm)
Re: 'global' rq->clock, David Miller, (Sat May 3, 4:36 pm)
Re: 'global' rq->clock, Ingo Molnar, (Sat May 3, 4:38 pm)
Re: 'global' rq->clock, David Miller, (Sat May 3, 4:40 pm)
Re: 'global' rq->clock, Ingo Molnar, (Sat May 3, 4:47 pm)
Re: 'global' rq->clock, Benjamin Herrenschmidt, (Sat May 3, 7:22 pm)
Re: 'global' rq->clock, Peter Zijlstra, (Sun May 4, 5:12 am)
Re: Horrendous Audio Stutter - current git, Frans Pop, (Wed May 7, 1:26 am)
Re: Horrendous Audio Stutter - current git, Ingo Molnar, (Wed May 7, 1:32 am)