linux/arch/x86_64/kernel
Robin Holt b291aa7a65 x86_64: fix HPET init race
I have had four seperate system lockups attributable to this exact problem
in two days of testing.  Instead of trying to handle all the weird end
cases and wrap, how about changing it to look for exactly what we appear
to want.

The following patch removes a couple races in setup_APIC_timer.  One occurs
when the HPET advances the COUNTER past the T0_CMP value between the time
the T0_CMP was originally read and when COUNTER is read.  This results in
a delay waiting for the counter to wrap.  The other results from the counter
wrapping.

This change takes a snapshot of T0_CMP at the beginning of the loop and
simply loops until T0_CMP has changed (a tick has happened).

<later>

I have one small concern about the patch.  I am not sure it meets the intent
as well as it should.  I think we are trying to match APIC timer interrupts up
with the hpet counter increment.  The event which appears to be disturbing
this loop in our test environment is the NMI watchdog.  What we believe has
been happening with the existing code is the setup_APIC_timer loop has read
the CMP value, and the NMI watchdog code fires for the first time.  This
results in a series of icache miss slowdowns and by the time we get back to
things it has wrapped.

I think this code is trying to get the CMP as close to the counter value as
possible.  If that is the intent, maybe we should really be testing against a
"window" around the CMP.  Something like COUNTER = CMP+/2.  It appears COUNTER
should get advanced every 89nSec (IIRC).  The above seems like an unreasonably
small window, but may be necessary.  Without documentation, I am not sure of
the original intent with this code.

In summary, this code fixes my boot hangs, but since I am not certain of the
intent of the existing code, I am not certain this has not introduced new bugs
or unexpected behaviors.

Signed-off-by: Robin Holt <holt@sgi.com>
Acked-by: Andi Kleen <ak@suse.de>
Cc: Vojtech Pavlik <vojtech@suse.cz>
Cc: "Aaron Durbin" <adurbin@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-08-11 15:47:39 -07:00
..
acpi ACPI: restore CONFIG_ACPI_SLEEP 2007-07-29 16:53:59 -07:00
cpufreq [CPUFREQ] the overdue removal of X86_SPEEDSTEP_CENTRINO_ACPI 2007-07-13 01:29:51 -04:00
aperture.c x86_64: arch/x86_64/kernel/aperture.c lower printk severity 2007-07-21 18:37:14 -07:00
apic.c x86_64: fix HPET init race 2007-08-11 15:47:39 -07:00
asm-offsets.c [PATCH] x86-64: Auto compute __NR_syscall_max at compile time 2007-05-02 19:27:18 +02:00
audit.c [PATCH] audit signal recipients 2007-05-11 05:38:25 -04:00
bugs.c x86_64: include asm/bugs.h in bugs.c for check_bugs prototype 2007-07-31 15:39:42 -07:00
crash_dump.c
crash.c move die notifier handling to common code 2007-05-08 11:15:04 -07:00
e820.c x86_64: arch/x86_64/kernel/e820.c lower printk severity 2007-07-21 18:37:14 -07:00
early_printk.c xen: use the hvc console infrastructure for Xen console 2007-07-18 08:47:44 -07:00
early-quirks.c x86_64: move iommu declaration from proto to iommu.h 2007-07-21 18:37:14 -07:00
entry.S remove unused TIF_NOTIFY_RESUME flag 2007-07-31 15:39:38 -07:00
genapic_flat.c [PATCH] x86-64: Fix allnoconfig error in genapic_flat.c 2007-05-02 19:27:21 +02:00
genapic.c [PATCH] x86: adjust inclusion of asm/fixmap.h 2007-05-02 19:27:04 +02:00
head64.c x86_64: display more intuitive error message if kernel is not 2MB aligned 2007-05-11 08:29:32 -07:00
head.S ACPI: restore CONFIG_ACPI_SLEEP 2007-07-29 16:53:59 -07:00
hpet.c x86_64: fix section mismatch warning in hpet.c 2007-07-22 11:03:38 -07:00
i387.c [PATCH] x86-64: use BUILD_BUG_ON in FPU code 2006-12-07 02:14:01 +01:00
i8259.c x86_64: Move functions declarations to header file 2007-07-21 18:37:12 -07:00
init_task.c use the new percpu interface for shared data 2007-07-19 10:04:45 -07:00
io_apic.c x86_64: check remote IRR bit before migrating level triggered irq 2007-07-21 18:37:10 -07:00
ioport.c header cleaning: don't include smp_lock.h when not used 2007-05-08 11:15:07 -07:00
irq.c x86_64 irq: use mask/unmask and proper locking in fixup_irqs() 2007-06-26 16:54:29 -07:00
k8.c Avoid zero size allocation in cache_k8_northbridges() 2007-05-23 20:14:12 -07:00
kprobes.c x86: Fix alternatives and kprobes to remap write-protected kernel text 2007-07-22 11:03:37 -07:00
ldt.c header cleaning: don't include smp_lock.h when not used 2007-05-08 11:15:07 -07:00
machine_kexec.c Revert "[PATCH] x86: __pa and __pa_symbol address space separation" 2007-05-07 08:44:24 -07:00
Makefile revert "x86, serial: convert legacy COM ports to platform devices" 2007-07-31 15:39:38 -07:00
mce_amd.c x86_64: Fix APIC typo 2007-07-21 18:37:09 -07:00
mce_intel.c [PATCH] x86: Add a cumulative thermal throttle event counter. 2006-09-26 10:52:42 +02:00
mce.c x86: Stop MCEs and NMIs during code patching 2007-07-22 11:03:37 -07:00
module.c [PATCH] Generic BUG for x86-64 2006-12-08 08:28:39 -08:00
mpparse.c x86_64: remove unused variable maxcpus 2007-07-21 18:37:09 -07:00
nmi.c x86: Stop MCEs and NMIs during code patching 2007-07-22 11:03:37 -07:00
pci-calgary.c x86-64: introduce struct pci_sysdata to facilitate sharing of ->sysdata 2007-07-21 18:37:14 -07:00
pci-dma.c x86_64: move iommu declaration from proto to iommu.h 2007-07-21 18:37:14 -07:00
pci-gart.c x86_64: move iommu declaration from proto to iommu.h 2007-07-21 18:37:14 -07:00
pci-nommu.c x86_64: move iommu declaration from proto to iommu.h 2007-07-21 18:37:14 -07:00
pci-swiotlb.c x86_64: move iommu declaration from proto to iommu.h 2007-07-21 18:37:14 -07:00
pmtimer.c [PATCH] time: x86_64: convert x86_64 to use GENERIC_TIME 2007-02-16 08:14:00 -08:00
process.c Remove fs.h from mm.h 2007-07-29 17:09:29 -07:00
ptrace.c Handle bogus %cs selector in single-step instruction decoding 2007-07-18 12:09:01 -07:00
reboot.c x86_64: move iommu declaration from proto to iommu.h 2007-07-21 18:37:14 -07:00
relocate_kernel.S [PATCH] Avoid overwriting the current pgd (V4, x86_64) 2006-09-26 10:52:38 +02:00
setup64.c x86_64: Ignore compat mode SYSCALL when IA32_EMULATION is not defined 2007-06-22 18:41:19 -07:00
setup.c ACPI: restore CONFIG_ACPI_SLEEP 2007-07-29 16:53:59 -07:00
signal.c x86: i386-show-unhandled-signals-v3 2007-07-22 11:03:37 -07:00
smp.c x86_64: Quicklist support for x86_64 2007-07-21 18:37:09 -07:00
smpboot.c header cleaning: don't include smp_lock.h when not used 2007-05-08 11:15:07 -07:00
stacktrace.c simplify the stacktrace code 2007-05-08 11:14:58 -07:00
suspend_asm.S [PATCH] x86-64: Relocatable Kernel Support 2007-05-02 19:27:07 +02:00
suspend.c Replace CONFIG_SOFTWARE_SUSPEND with CONFIG_HIBERNATION 2007-07-29 16:45:38 -07:00
sys_x86_64.c Remove fs.h from mm.h 2007-07-29 17:09:29 -07:00
syscall.c [PATCH] x86-64: Auto compute __NR_syscall_max at compile time 2007-05-02 19:27:18 +02:00
tce.c x86-64: Calgary: fix section mismatch warnings in tce 2007-07-31 15:39:37 -07:00
time.c x86_64: use the global PIT lock 2007-07-21 18:37:12 -07:00
trampoline.S [PATCH] x86-64: Move cpu verification code to common file 2007-05-02 19:27:08 +02:00
traps.c x86: i386-show-unhandled-signals-v3 2007-07-22 11:03:37 -07:00
tsc_sync.c [PATCH] x86: Log reason why TSC was marked unstable 2007-05-02 19:27:08 +02:00
tsc.c x86_64: cleanup tsc.c merge artifact 2007-07-26 11:35:20 -07:00
verify_cpu.S Unify the CPU features vectors between i386 and x86-64 2007-07-12 10:55:54 -07:00
vmlinux.lds.S x86_64: Squash initial_code modpost warnings 2007-07-22 11:03:38 -07:00
vsmp.c [PATCH] Fix build breakage with CONFIG_X86_VSMP 2006-10-12 12:25:27 -07:00
vsyscall.c x86_64: Add vDSO for x86-64 with gettimeofday/clock_gettime/getcpu 2007-07-21 18:37:08 -07:00
x8664_ksyms.c [PATCH] x86: Export _proxy_pda for gcc 4.2 2007-03-16 21:07:36 +01:00