]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
sched_clock: widen the max and min time
authorSteven Rostedt <rostedt@goodmis.org>
Mon, 7 Jul 2008 18:16:51 +0000 (14:16 -0400)
committerIngo Molnar <mingo@elte.hu>
Fri, 11 Jul 2008 13:53:25 +0000 (15:53 +0200)
With keeping the max and min sched time within one jiffy of the gtod clock
was too tight. Just before a schedule tick the max could easily be hit, as
well as just after a schedule_tick the min could be hit. This caused the
clock to jump around by a jiffy.

This patch widens the minimum to
   last gtod + (delta_jiffies ? delta_jiffies - 1 : 0) * TICK_NSECS

and the maximum to
    last gtod + (2 + delta_jiffies) * TICK_NSECS

This keeps the minum to gtod or if one jiffy less than delta jiffies
and the maxim 2 jiffies ahead of gtod. This may cause unstable TSCs to be
a bit more sporadic, but it helps keep a clock with a stable TSC working well.

Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Cc: Steven Rostedt <srostedt@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/sched_clock.c

index e383bc7df6dd859ffed2c8d161e4dc4d1559564c..42b81fa38cbd254987dbedef0f0bd047766d36e3 100644 (file)
@@ -96,14 +96,21 @@ static void __update_sched_clock(struct sched_clock_data *scd, u64 now)
        s64 delta = now - scd->prev_raw;
 
        WARN_ON_ONCE(!irqs_disabled());
-       min_clock = scd->tick_gtod + delta_jiffies * TICK_NSEC;
+
+       min_clock = scd->tick_gtod +
+               (delta_jiffies ? delta_jiffies - 1 : 0) * TICK_NSEC;
 
        if (unlikely(delta < 0)) {
                clock++;
                goto out;
        }
 
-       max_clock = min_clock + TICK_NSEC;
+       /*
+        * The clock must stay within a jiffie of the gtod.
+        * But since we may be at the start of a jiffy or the end of one
+        * we add another jiffy buffer.
+        */
+       max_clock = scd->tick_gtod + (2 + delta_jiffies) * TICK_NSEC;
 
        if (unlikely(clock + delta > max_clock)) {
                if (clock < max_clock)