linux/arch
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
..
alpha alpha: fix ALSA DMA mmap crash 2008-04-02 15:28:19 -07:00
arm [ARM] 4873/1: Fix ITE 8152 interrupt demux 2008-03-28 15:07:46 +00:00
avr32 avr32: Fix bug in early resource allocation code 2008-03-27 15:31:57 +01:00
blackfin [Blackfin] arch: fix atomic and32/xor32 comments and ENDPROC markings 2008-03-03 17:44:14 -07:00
cris cris: correct usage of __user for copy to and from user space in lib/usercopy and uaccess.h 2008-03-04 16:35:16 -08:00
frv FRV: Change the timerfd syscalls to be the same as i386 2008-02-20 19:58:16 -08:00
h8300 h8300: defconfig update 2008-02-23 17:12:16 -08:00
ia64 [IA64] kprobes arch consolidation build fix 2008-03-06 09:49:01 -08:00
m32r ide: introduce HAVE_IDE 2008-02-09 10:46:40 +01:00
m68k m68k{,nommu}: Wire up new timerfd syscalls 2008-03-04 08:04:11 -08:00
m68knommu m68k{,nommu}: Wire up new timerfd syscalls 2008-03-04 08:04:11 -08:00
mips [MIPS] XSS1500: Fix compilation 2008-04-01 15:46:34 +01:00
mn10300 MN10300: define HZ as a config option 2008-02-23 17:12:13 -08:00
parisc [PARISC] head.S: section mismatch fixes 2008-03-15 19:12:22 -07:00
powerpc [POWERPC] Fix MPC5200 (not B!) device tree so FEC ethernet works 2008-04-03 22:11:12 +11:00
ppc [PPC] 8xx: swap bug-fix 2008-03-07 16:56:54 -06:00
s390 [S390] futex: let futex_atomic_cmpxchg_pt survive early functional tests. 2008-03-20 17:33:46 +01:00
sh sh: Fix up uImage compression type 2008-03-31 16:17:11 +09:00
sparc Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2008-03-17 23:44:31 -07:00
sparc64 sparc64: remove unused calc_npages() in iommu_common.h 2008-03-28 15:56:01 -07:00
um [UML]: uml-net: don't set IFF_ALLMULTI in set_multicast_list 2008-03-26 00:16:29 -07:00
v850 ide: introduce HAVE_IDE 2008-02-09 10:46:40 +01:00
x86 x86: tsc prevent time going backwards 2008-04-04 18:36:49 +02:00
xtensa [XTENSA] Allow debugger to modify the WINDOWBASE register. 2008-02-13 17:45:36 -08:00
.gitignore arch: Ignore arch/i386 and arch/x86_64 2008-01-19 21:29:39 -08:00
Kconfig Kprobes: indicate kretprobe support in Kconfig 2008-03-04 16:35:11 -08:00