kernel-fxtec-pro1x/arch/x86/kernel
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
..
acpi PCI: don't load acpi_php when acpi is disabled 2008-02-21 15:34:37 -08:00
cpu x86: print message if nmi_watchdog=2 cannot be enabled 2008-04-04 18:36:45 +02:00
.gitignore
alternative.c x86: fix up alternatives with lockdep enabled 2008-01-30 13:33:24 +01:00
aperture_64.c x86: fix long standing bug with usb after hibernation with 4GB ram 2008-03-21 17:06:15 +01:00
apic_32.c x86: don't disable the APIC if it hasn't been mapped yet 2008-01-30 13:33:17 +01:00
apic_64.c x86: change bios_cpu_apicid to percpu data variable fixup 2008-01-30 13:33:21 +01:00
apm_32.c x86: isolate PIC/PIT in/out calls 2008-01-30 13:33:14 +01:00
asm-offsets.c
asm-offsets_32.c lguest: fix build breakage 2008-02-26 12:55:49 +01:00
asm-offsets_64.c x86: add asm_offset PARAVIRT constants 2008-01-30 13:33:19 +01:00
audit_64.c
bootflag.c x86: coding style cleanup for kernel/bootflag.c 2008-01-30 13:32:31 +01:00
bugs_64.c x86, 32-bit: trim memory not covered by wb mtrrs 2008-01-30 13:33:18 +01:00
cpuid.c x86: cpuid, msr: use inode mutex instead of big kernel lock 2008-02-04 16:47:59 +01:00
crash.c
crash_dump_32.c
crash_dump_64.c
doublefault_32.c x86: unify tss_struct 2008-01-30 13:31:31 +01:00
ds.c x86: fix small sparse warning 2008-01-31 22:05:47 +01:00
e820_32.c x86: trim mtrr don't close gap for resource allocation. 2008-03-21 17:06:15 +01:00
e820_64.c x86: trim mtrr don't close gap for resource allocation. 2008-03-21 17:06:15 +01:00
early-quirks.c x86: fix section mismatch warning in early-quirks.c 2008-01-30 13:33:37 +01:00
early_printk.c x86: make early_console static in early_printk.c 2008-02-01 17:49:42 +01:00
efi.c x86: sparse warning in efi.c 2008-02-19 16:18:28 +01:00
efi_32.c x86: sparse error in efi_32.c 2008-02-19 16:18:28 +01:00
efi_64.c x86: EFI runtime code mapping enhancement 2008-02-13 16:20:35 +01:00
efi_stub_32.S
efi_stub_64.S x86: EFI runtime service support 2008-01-30 13:31:19 +01:00
entry_32.S x86: don't make irq_return global 2008-02-19 16:18:29 +01:00
entry_64.S x86: fix execve with -fstack-protect 2008-02-26 12:55:57 +01:00
genapic_64.c x86: cleanup x86_cpu_to_apicid references 2008-01-30 13:33:11 +01:00
genapic_flat_64.c
geode_32.c x86: GEODE: MFGPT: Use "just-in-time" detection for the MFGPT timers 2008-02-09 23:24:08 +01:00
head64.c x86: zap invalid and unused pmds in early boot 2008-02-18 20:54:14 +01:00
head_32.S x86: fix fault_msg nul termination 2008-03-21 17:06:15 +01:00
head_64.S x86: rename KERNEL_TEXT_SIZE => KERNEL_IMAGE_SIZE 2008-02-26 12:55:56 +01:00
hpet.c x86: hpet fix docbook comment 2008-02-26 12:55:50 +01:00
i386_ksyms_32.c
i387.c x86: fix merge mistake in i387.c 2008-03-07 16:39:14 +01:00
i8237.c
i8253.c x86: pit_clockevent can be static 2008-02-13 16:20:35 +01:00
i8259_32.c x86: i8259A: remove redundant irq_descinitialization 2008-02-19 16:18:34 +01:00
i8259_64.c x86: provide a native_init_IRQ function on 64-bit 2008-01-30 13:33:19 +01:00
init_task.c x86: delay the export removal of init_mm 2008-02-29 18:55:42 +01:00
io_apic_32.c arch/x86/kernel/io_apic_{64,32}.c: use time_before 2008-01-30 13:32:19 +01:00
io_apic_64.c arch/x86/kernel/io_apic_{64,32}.c: use time_before 2008-01-30 13:32:19 +01:00
io_delay.c x86: add dmi quirk for io_delay 2008-03-26 22:23:40 +01:00
ioport.c x86: refactor ioport unification 2008-01-30 13:33:10 +01:00
irq_32.c x86: remove all definitions with fastcall 2008-01-30 13:31:17 +01:00
irq_64.c x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
k8.c
kdebugfs.c x86 boot : export boot_params via debugfs for debugging 2008-01-30 13:32:51 +01:00
kprobes.c x86, kprobes: remove sparse warnings from x86 2008-02-19 16:18:28 +01:00
ldt.c x86: cleanup - eliminate numbers in LDT allocation code 2008-02-04 16:48:03 +01:00
machine_kexec_32.c vmcoreinfo: fix the configuration dependencies 2008-02-07 08:42:25 -08:00
machine_kexec_64.c vmcoreinfo: add the symbol "phys_base" 2008-04-02 15:28:19 -07:00
Makefile x86: exclude vsyscall files from stackprotect 2008-02-19 16:18:32 +01:00
mca_32.c
mfgpt_32.c x86: GEODE: add missing module.h include 2008-03-26 22:23:40 +01:00
microcode.c x86: fix section mismatch warnings when referencing notifiers 2008-02-01 17:49:42 +01:00
module_32.c
module_64.c
mpparse_32.c Introduce flags for reserve_bootmem() 2008-02-07 08:42:25 -08:00
mpparse_64.c x86: fix section mismatch warning in acpi/boot.c 2008-01-30 13:33:37 +01:00
msr.c x86: cpuid, msr: use inode mutex instead of big kernel lock 2008-02-04 16:47:59 +01:00
nmi_32.c x86: fix compile warning building without CONFIG_SYSCTL 2008-02-19 16:18:29 +01:00
nmi_64.c x86: fix compile warning building without CONFIG_SYSCTL 2008-02-19 16:18:29 +01:00
numaq_32.c x86: convert TSC disabling to generic cpuid disable bitmap 2008-01-30 13:33:20 +01:00
paravirt.c x86: fill in missing pv_mmu_ops entries for PAGETABLE_LEVELS >= 3 2008-01-30 13:33:20 +01:00
paravirt_patch_32.c x86: move patching code to arch-specific file. 2008-01-30 13:32:10 +01:00
paravirt_patch_64.c x86: add stringify header 2008-01-30 13:33:19 +01:00
pci-calgary_64.c iommu sg: x86: convert calgary IOMMU to use the IOMMU helper 2008-02-05 09:44:11 -08:00
pci-dma_32.c
pci-dma_64.c x86: revert: reserve dma32 early for gart 2008-03-22 19:25:41 +01:00
pci-gart_64.c x86, agpgart: scary messages are fortunately obsolete 2008-04-04 18:36:46 +02:00
pci-nommu_64.c
pci-swiotlb_64.c
pcspeaker.c
pmtimer_64.c
process_32.c x86: disable BTS ptrace extensions for now 2008-02-29 18:55:42 +01:00
process_64.c x86: disable BTS ptrace extensions for now 2008-02-29 18:55:42 +01:00
ptrace.c x86: ptrace.c: fix defined-but-unused warnings 2008-03-27 16:08:44 +01:00
quirks.c x86: hpet clock enable quirk on nVidia nForce 430 2008-03-21 17:06:15 +01:00
reboot.c x86: fix reboot problem with Dell Optiplex 745, 0KW626 board 2008-03-21 17:06:15 +01:00
reboot_fixups_32.c x86: add the RDC machine specific reboot fixup 2008-01-30 13:33:36 +01:00
relocate_kernel_32.S
relocate_kernel_64.S
rtc.c x86: fix sched_clock() 2008-01-30 13:32:40 +01:00
scx200_32.c x86: fix sparse warning in kernel/scx200_32.c 2008-01-31 22:05:45 +01:00
setup64.c x86: tight online check in setup_per_cpu_areas 2008-03-21 17:06:15 +01:00
setup_32.c x86: fix trim mtrr not to setup_memory two times 2008-03-26 22:23:41 +01:00
setup_64.c x86: fix memoryless node oops during boot 2008-03-26 22:23:40 +01:00
sigframe_32.h
signal_32.c x86: clear DF before calling signal handler 2008-03-07 16:39:14 +01:00
signal_64.c x86: ia32 syscall restart fix 2008-03-11 17:11:54 +01:00
smp_32.c x86: voluntary leave_mm before entering ACPI C3 2008-01-30 13:32:01 +01:00
smp_64.c x86: voluntary leave_mm before entering ACPI C3 2008-01-30 13:32:01 +01:00
smpboot_32.c calibrate_delay() must be __cpuinit 2008-02-06 10:41:08 -08:00
smpboot_64.c x86: make c_idle.work have a static address. 2008-02-26 12:56:02 +01:00
smpcommon_32.c x86: change write_gdt_entry signature. 2008-01-30 13:31:13 +01:00
srat_32.c Merge branches 'release', 'bugzilla-6217', 'bugzilla-6629', 'bugzilla-6933', 'bugzilla-7186', 'bugzilla-8269', 'bugzilla-8570', 'bugzilla-9139', 'bugzilla-9277', 'bugzilla-9341', 'bugzilla-9444', 'bugzilla-9614', 'bugzilla-9643' and 'bugzilla-9644' into release 2008-02-07 03:09:43 -05:00
stacktrace.c x86: don't save unreliable stack trace entries 2008-02-26 12:55:58 +01:00
step.c x86 ptrace: avoid unnecessary wrmsr 2008-04-03 15:42:43 -07:00
summit_32.c
sys_i386_32.c
sys_x86_64.c x86: PIE executable randomization, checkpatch fixes 2008-01-30 13:31:07 +01:00
syscall_64.c
syscall_table_32.S timerfd: wire the new timerfd API to the x86 family 2008-02-05 09:44:07 -08:00
tce_64.c
test_nx.c x86: mark the .rodata section also NX 2008-02-06 22:39:45 +01:00
test_rodata.c x86: include proper prototypes for rodata_test 2008-02-14 23:30:20 +01:00
time_32.c x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
time_64.c time: fix typo in comments 2008-02-08 09:22:29 -08:00
tls.c x86: tls prevent_tail_call 2008-02-29 18:55:39 +01:00
tls.h x86: x86 user_regset TLS 2008-01-30 13:31:52 +01:00
topology.c x86: fix section mismatch warning in topology.c:arch_register_cpu 2008-02-19 16:18:30 +01:00
trampoline_32.S x86: remove misleading comments in trampoline_*.S 2008-02-04 16:48:01 +01:00
trampoline_64.S x86: remove misleading comments in trampoline_*.S 2008-02-04 16:48:01 +01:00
traps_32.c x86: fix sparse error in traps_32.c 2008-02-06 22:39:44 +01:00
traps_64.c x86: fix "BUG: sleeping function called from invalid context" in print_vma_addr() 2008-02-14 23:30:19 +01:00
tsc_32.c x86: tsc prevent time going backwards 2008-04-04 18:36:49 +02:00
tsc_64.c x86: tsc prevent time going backwards 2008-04-04 18:36:49 +02:00
tsc_sync.c x86: add warning to check_tsc_warp() 2008-01-30 13:33:24 +01:00
verify_cpu_64.S
vm86_32.c arch/x86/: spelling fixes 2008-01-30 13:31:42 +01:00
vmi_32.c x86: VMI fix 2008-02-04 16:47:54 +01:00
vmiclock_32.c x86: isolate PIC/PIT in/out calls 2008-01-30 13:33:14 +01:00
vmlinux.lds.S
vmlinux_32.lds.S x86: lds - Use PAGE_SIZE instead of numeric constant 2008-02-19 16:18:33 +01:00
vmlinux_64.lds.S x86: lds - Use THREAD_SIZE instead of numeric constant 2008-02-19 16:18:34 +01:00
vsmp_64.c
vsyscall_64.c x86: restore vsyscall64 prochandler 2008-02-29 18:55:39 +01:00
x8664_ksyms_64.c x86: export cpu_gdt_descr 2008-01-30 13:31:10 +01:00