aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-04-07 14:58:08 -0400
committerIngo Molnar <mingo@elte.hu>2008-04-07 15:09:14 -0400
commit5b13d863573e746739ccfc24ac1a9473cfee8df1 (patch)
treeaa7f3536bf6f1c491a6051cf55b4ed71cd2a421c /arch
parent4cac04dd63fa3b202ee313ed1afbbd135ab887ee (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.c15
-rw-r--r--arch/x86/kernel/tsc_64.c23
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
289static unsigned long current_tsc_khz = 0; 289static unsigned long current_tsc_khz = 0;
290static 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 */
303static cycle_t read_tsc(void) 291static 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
313static struct clocksource clocksource_tsc = { 300static 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
16static int notsc __initdata = 0; 15static 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
294static 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 */
308static cycle_t read_tsc(void) 295static 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
316static cycle_t __vsyscall_fn vread_tsc(void) 301static 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
324static struct clocksource clocksource_tsc = { 307static struct clocksource clocksource_tsc = {