sched, x86: Fix cpufreq + sched_clock() TSC scaling
authorPeter Zijlstra <peterz@infradead.org>
Tue, 16 Jun 2009 19:34:17 +0000 (12:34 -0700)
committerIngo Molnar <mingo@elte.hu>
Wed, 17 Jun 2009 14:03:54 +0000 (16:03 +0200)
commit84599f8a59e77699f18f06948cea171a349a3f0f
tree9918eccc9bcc2a91eb0f5609f9ad69c59ac66bd0
parent03347e2592078a90df818670fddf97a33eec70fb
sched, x86: Fix cpufreq + sched_clock() TSC scaling

For freqency dependent TSCs we only scale the cycles, we do not account
for the discrepancy in absolute value.

Our current formula is: time = cycles * mult

(where mult is a function of the cpu-speed on variable tsc machines)

Suppose our current cycle count is 10, and we have a multiplier of 5,
then our time value would end up being 50.

Now cpufreq comes along and changes the multiplier to say 3 or 7,
which would result in our time being resp. 30 or 70.

That means that we can observe random jumps in the time value due to
frequency changes in both fwd and bwd direction.

So what this patch does is change the formula to:

  time = cycles * frequency + offset

And we calculate offset so that time_before == time_after, thereby
ridding us of these jumps in time.

[ Impact: fix/reduce sched_clock() jumps across frequency changing events ]

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Chucked-on-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
arch/x86/include/asm/timer.h
arch/x86/kernel/tsc.c