aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched_clock.c
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2008-07-07 14:16:51 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-11 09:53:25 -0400
commitf7cce27f5605b9e137b829a47949cb2d3c7e1cab (patch)
treefbe270ccfb5cee3d055a52b6351ade2d34c5d74b /kernel/sched_clock.c
parent62c43dd9864dbd52ff158922d1d08c75f20335af (diff)
sched_clock: widen the max and min time
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>
Diffstat (limited to 'kernel/sched_clock.c')
-rw-r--r--kernel/sched_clock.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
index e383bc7df6dd..42b81fa38cbd 100644
--- a/kernel/sched_clock.c
+++ b/kernel/sched_clock.c
@@ -96,14 +96,21 @@ static void __update_sched_clock(struct sched_clock_data *scd, u64 now)
96 s64 delta = now - scd->prev_raw; 96 s64 delta = now - scd->prev_raw;
97 97
98 WARN_ON_ONCE(!irqs_disabled()); 98 WARN_ON_ONCE(!irqs_disabled());
99 min_clock = scd->tick_gtod + delta_jiffies * TICK_NSEC; 99
100 min_clock = scd->tick_gtod +
101 (delta_jiffies ? delta_jiffies - 1 : 0) * TICK_NSEC;
100 102
101 if (unlikely(delta < 0)) { 103 if (unlikely(delta < 0)) {
102 clock++; 104 clock++;
103 goto out; 105 goto out;
104 } 106 }
105 107
106 max_clock = min_clock + TICK_NSEC; 108 /*
109 * The clock must stay within a jiffie of the gtod.
110 * But since we may be at the start of a jiffy or the end of one
111 * we add another jiffy buffer.
112 */
113 max_clock = scd->tick_gtod + (2 + delta_jiffies) * TICK_NSEC;
107 114
108 if (unlikely(clock + delta > max_clock)) { 115 if (unlikely(clock + delta > max_clock)) {
109 if (clock < max_clock) 116 if (clock < max_clock)