diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2008-07-07 14:16:51 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-11 09:53:25 -0400 |
commit | f7cce27f5605b9e137b829a47949cb2d3c7e1cab (patch) | |
tree | fbe270ccfb5cee3d055a52b6351ade2d34c5d74b /kernel/sched_clock.c | |
parent | 62c43dd9864dbd52ff158922d1d08c75f20335af (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.c | 11 |
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) |