diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-04-07 14:58:08 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-07 15:09:14 -0400 |
commit | 5b13d863573e746739ccfc24ac1a9473cfee8df1 (patch) | |
tree | aa7f3536bf6f1c491a6051cf55b4ed71cd2a421c /arch | |
parent | 4cac04dd63fa3b202ee313ed1afbbd135ab887ee (diff) |
revert "x86: tsc prevent time going backwards"
revert:
| commit 47001d603375f857a7fab0e9c095d964a1ea0039
| Author: Thomas Gleixner <tglx@linutronix.de>
| Date: Tue Apr 1 19:45:18 2008 +0200
|
| x86: tsc prevent time going backwards
it has been identified to cause suspend regression - and the
commit fixes a longstanding bug that existed before 2.6.25 was
opened - so it can wait some more until the effects are better
understood.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/tsc_32.c | 15 | ||||
-rw-r--r-- | arch/x86/kernel/tsc_64.c | 23 |
2 files changed, 4 insertions, 34 deletions
diff --git a/arch/x86/kernel/tsc_32.c b/arch/x86/kernel/tsc_32.c index d7498b34c8e9..f14cfd9d1f94 100644 --- a/arch/x86/kernel/tsc_32.c +++ b/arch/x86/kernel/tsc_32.c | |||
@@ -287,27 +287,14 @@ core_initcall(cpufreq_tsc); | |||
287 | /* clock source code */ | 287 | /* clock source code */ |
288 | 288 | ||
289 | static unsigned long current_tsc_khz = 0; | 289 | static unsigned long current_tsc_khz = 0; |
290 | static struct clocksource clocksource_tsc; | ||
291 | 290 | ||
292 | /* | ||
293 | * We compare the TSC to the cycle_last value in the clocksource | ||
294 | * structure to avoid a nasty time-warp issue. This can be observed in | ||
295 | * a very small window right after one CPU updated cycle_last under | ||
296 | * xtime lock and the other CPU reads a TSC value which is smaller | ||
297 | * than the cycle_last reference value due to a TSC which is slighty | ||
298 | * behind. This delta is nowhere else observable, but in that case it | ||
299 | * results in a forward time jump in the range of hours due to the | ||
300 | * unsigned delta calculation of the time keeping core code, which is | ||
301 | * necessary to support wrapping clocksources like pm timer. | ||
302 | */ | ||
303 | static cycle_t read_tsc(void) | 291 | static cycle_t read_tsc(void) |
304 | { | 292 | { |
305 | cycle_t ret; | 293 | cycle_t ret; |
306 | 294 | ||
307 | rdtscll(ret); | 295 | rdtscll(ret); |
308 | 296 | ||
309 | return ret >= clocksource_tsc.cycle_last ? | 297 | return ret; |
310 | ret : clocksource_tsc.cycle_last; | ||
311 | } | 298 | } |
312 | 299 | ||
313 | static struct clocksource clocksource_tsc = { | 300 | static struct clocksource clocksource_tsc = { |
diff --git a/arch/x86/kernel/tsc_64.c b/arch/x86/kernel/tsc_64.c index 01fc9f0c39e2..947554ddabb6 100644 --- a/arch/x86/kernel/tsc_64.c +++ b/arch/x86/kernel/tsc_64.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <asm/hpet.h> | 11 | #include <asm/hpet.h> |
12 | #include <asm/timex.h> | 12 | #include <asm/timex.h> |
13 | #include <asm/timer.h> | 13 | #include <asm/timer.h> |
14 | #include <asm/vgtod.h> | ||
15 | 14 | ||
16 | static int notsc __initdata = 0; | 15 | static int notsc __initdata = 0; |
17 | 16 | ||
@@ -291,34 +290,18 @@ int __init notsc_setup(char *s) | |||
291 | 290 | ||
292 | __setup("notsc", notsc_setup); | 291 | __setup("notsc", notsc_setup); |
293 | 292 | ||
294 | static struct clocksource clocksource_tsc; | ||
295 | 293 | ||
296 | /* | 294 | /* clock source code: */ |
297 | * We compare the TSC to the cycle_last value in the clocksource | ||
298 | * structure to avoid a nasty time-warp. This can be observed in a | ||
299 | * very small window right after one CPU updated cycle_last under | ||
300 | * xtime/vsyscall_gtod lock and the other CPU reads a TSC value which | ||
301 | * is smaller than the cycle_last reference value due to a TSC which | ||
302 | * is slighty behind. This delta is nowhere else observable, but in | ||
303 | * that case it results in a forward time jump in the range of hours | ||
304 | * due to the unsigned delta calculation of the time keeping core | ||
305 | * code, which is necessary to support wrapping clocksources like pm | ||
306 | * timer. | ||
307 | */ | ||
308 | static cycle_t read_tsc(void) | 295 | static cycle_t read_tsc(void) |
309 | { | 296 | { |
310 | cycle_t ret = (cycle_t)get_cycles(); | 297 | cycle_t ret = (cycle_t)get_cycles(); |
311 | 298 | return ret; | |
312 | return ret >= clocksource_tsc.cycle_last ? | ||
313 | ret : clocksource_tsc.cycle_last; | ||
314 | } | 299 | } |
315 | 300 | ||
316 | static cycle_t __vsyscall_fn vread_tsc(void) | 301 | static cycle_t __vsyscall_fn vread_tsc(void) |
317 | { | 302 | { |
318 | cycle_t ret = (cycle_t)vget_cycles(); | 303 | cycle_t ret = (cycle_t)vget_cycles(); |
319 | 304 | return ret; | |
320 | return ret >= __vsyscall_gtod_data.clock.cycle_last ? | ||
321 | ret : __vsyscall_gtod_data.clock.cycle_last; | ||
322 | } | 305 | } |
323 | 306 | ||
324 | static struct clocksource clocksource_tsc = { | 307 | static struct clocksource clocksource_tsc = { |