linux/arch/x86
Thomas Gleixner 47001d6033 x86: tsc prevent time going backwards
We already catch most of the TSC problems by sanity checks, but there
is a subtle bug which has been in the code for ever. This can cause
time jumps in the range of hours.

This was reported in:
     http://lkml.org/lkml/2007/8/23/96
and
     http://lkml.org/lkml/2008/3/31/23

I was able to reproduce the problem with a gettimeofday loop test on a
dual core and a quad core machine which both have sychronized
TSCs. The TSCs seems not to be perfectly in sync though, but the
kernel is not able to detect the slight delta in the sync check. Still
there exists an extremly small window where this delta can be observed
with a real big time jump. So far I was only able to reproduce this
with the vsyscall gettimeofday implementation, but in theory this
might be observable with the syscall based version as well.

CPU 0 updates the clock source variables under xtime/vyscall lock and
CPU1, where the TSC is slighty behind CPU0, is reading the time right
after the seqlock was unlocked.

The clocksource reference data was updated with the TSC from CPU0 and
the value which is read from TSC on CPU1 is less than the reference
data. This results in a huge delta value due to the unsigned
subtraction of the TSC value and the reference value. This algorithm
can not be changed due to the support of wrapping clock sources like
pm timer.

The huge delta is converted to nanoseconds and added to xtime, which
is then observable by the caller. The next gettimeofday call on CPU1
will show the correct time again as now the TSC has advanced above the
reference value.

To prevent this TSC specific wreckage we need to compare the TSC value
against the reference value and return the latter when it is larger
than the actual TSC value.

I pondered to mark the TSC unstable when the readout is smaller than
the reference value, but this would render an otherwise good and fast
clocksource unusable without a real good reason.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-04-04 18:36:49 +02:00
..
boot x86-boot: don't request VBE2 information 2008-03-07 16:39:14 +01:00
configs x86, core: remove CONFIG_FORCED_INLINING 2008-02-09 23:24:09 +01:00
crypto [CRYPTO] twofish: Merge common glue code 2008-01-14 17:07:57 +11:00
ia32 x86: clear DF before calling signal handler 2008-03-07 16:39:14 +01:00
kernel x86: tsc prevent time going backwards 2008-04-04 18:36:49 +02:00
kvm KVM: MMU: Fix memory leak on guest demand faults 2008-03-25 10:22:17 +02:00
lguest lguest: comment documentation update. 2008-03-28 11:05:54 +11:00
lib x86: clean up csum-wrappers_64.c some more 2008-02-19 16:18:32 +01:00
mach-default spelling fixes: arch/i386/ 2007-10-20 01:13:56 +02:00
mach-es7000 i386: es7000 minor cleanups 2007-10-17 20:16:15 +02:00
mach-generic spelling fixes: arch/i386/ 2007-10-20 01:13:56 +02:00
mach-rdc321x rdc321x: GPIO routines bugfixes 2008-03-27 16:08:45 +01:00
mach-visws x86/visws: fix printk format warnings 2008-03-21 17:06:15 +01:00
mach-voyager calibrate_delay() must be __cpuinit 2008-02-06 10:41:08 -08:00
math-emu x86: arch/x86/math-emu/errors.c: fix printk warnings 2008-01-30 13:32:13 +01:00
mm Avoid false positive warnings in kmap_atomic_prot() with DEBUG_HIGHMEM 2008-03-28 13:08:14 -07:00
oprofile x86: rename stack_pointer to kernel_trap_sp 2008-01-30 13:33:16 +01:00
pci fix BIOS PCI config cycle buglet causing ACPI boot regression 2008-03-10 18:09:05 -07:00
power x86 cleanup: suspend_asm_64.S - use X86_CR4_PGE instead of numeric value 2008-02-19 16:18:33 +01:00
vdso x86 vdso: fix build locale dependency 2008-02-29 18:55:39 +01:00
video i386: move video 2007-10-11 11:16:56 +02:00
xen xen: Clear PG_pinned in release_{pt,pd}() 2008-04-04 18:36:48 +02:00
Kconfig documentation: Move power-related files to Documentation/power/ 2008-03-12 18:10:51 -04:00
Kconfig.cpu x86: a P4 is a P6 not an i486 2008-03-04 11:55:34 -08:00
Kconfig.debug x86: change IO delay back to 0x80 2008-02-19 16:18:34 +01:00
Makefile x86: fix vdso_install breaks user "make install" 2008-02-19 16:18:34 +01:00
Makefile_32.cpu x86: move i386 and x86_64 Makefiles to arch/x86 2007-10-25 22:27:34 +02:00