diff options
| -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 = { |
