1
linux/arch/sparc64/kernel
Richard Mortimer 9eb3394bf2 [SPARC64]: Eliminate race condition reading Hummingbird STICK register
Ensure a consistent value is read from the STICK register by ensuring
that both high and low are read without high changing due to a roll
over of the low register.

Various Debian/SPARC users (myself include) have noticed problems with
Hummingbird based systems. The symptoms are that the system time is
seen to jump forward 3 days, 6 hours, 11 minutes give or take a few
seconds. In many cases the system then hangs some time afterwards.

I've spotted a race condition in the code to read the STICK register.
I could not work out why 3d, 6h, 11m is important but guess that it is
due to the 2^32 jump of STICK (forwards on one read and then the next
read will seem to be backwards) during a timer interrupt. I'm guessing
that a change of -2^32 will get converted to a large unsigned
increment after the arithmetic manipulation between STICK,
nanoseconds, jiffies etc.

I did a test where I modified __hbird_read_stick to artificially
inject rollover faults forcefully every few seconds. With this I saw
the clock jump over 6 times in 12 hours compared to once every month
or so.

Signed-off-by: Richard Mortimer <richm@oldelvet.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
2006-01-17 15:21:01 -08:00
..
asm-offsets.c kbuild: frv,m32r,sparc64 introduce fake asm-offsets.h file 2005-09-09 22:47:53 +02:00
auxio.c
binfmt_aout32.c [PATCH] dump_thread() cleanup 2006-01-10 08:01:25 -08:00
binfmt_elf32.c
central.c
chmc.c
cpu.c [SPARC64]: Use ARRAY_SIZE macro 2005-11-09 12:03:42 -08:00
devices.c [SPARC64]: Probe D/I/E-cache config and use. 2005-09-26 00:32:17 -07:00
dtlb_backend.S [SPARC64]: Kill SZ_BITS define from dtlb_backend.S 2005-09-21 19:23:48 -07:00
dtlb_base.S [SPARC64]: Fix boot failures on SunBlade-150 2005-10-12 12:22:46 -07:00
dtlb_prot.S [SPARC64]: Fix boot failures on SunBlade-150 2005-10-12 12:22:46 -07:00
ebus.c [PATCH] PCI: pci_find_device remove (sparc64/kernel/ebus.c) 2006-01-09 12:13:15 -08:00
entry.S [SPARC64]: Fix ptrace/strace 2006-01-09 14:35:50 -08:00
etrap.S [SPARC64]: Replace cheetah+ code patching with variables. 2005-10-04 15:23:20 -07:00
head.S [SPARC64]: Fix boot failures on SunBlade-150 2005-10-12 12:22:46 -07:00
idprom.c
init_task.c
iommu_common.c
iommu_common.h
irq.c [SPARC64]: Fix compile error in irq.c 2005-10-08 21:12:04 -07:00
isa.c
itlb_base.S [SPARC64]: Fix boot failures on SunBlade-150 2005-10-12 12:22:46 -07:00
kprobes.c [PATCH] kprobes: fix race in recovery of reentrant probe 2006-01-11 18:42:12 -08:00
ktlb.S [SPARC64]: Fix boot failures on SunBlade-150 2005-10-12 12:22:46 -07:00
Makefile [PATCH] sanitize building of fs/compat_ioctl.c 2006-01-10 08:01:33 -08:00
module.c
pci_common.c
pci_impl.h
pci_iommu.c [SPARC64]: Eliminate PCI IOMMU dma mapping size limit. 2005-10-13 22:15:24 -07:00
pci_psycho.c [SPARC64]: Consolidate common PCI IOMMU init code. 2005-10-13 21:10:08 -07:00
pci_sabre.c [SPARC64]: Consolidate common PCI IOMMU init code. 2005-10-13 21:10:08 -07:00
pci_schizo.c [SPARC64]: Consolidate common PCI IOMMU init code. 2005-10-13 21:10:08 -07:00
pci.c [PATCH] Make sparc64 use setup-res.c 2005-09-08 14:57:25 -07:00
power.c [SPARC64]: Add needed pm_power_off symbol. 2006-01-09 14:12:50 -08:00
process.c [PATCH] sparc64: task_stack_page() 2006-01-12 09:08:52 -08:00
ptrace.c [PATCH] sparc64: task_pt_regs() 2006-01-12 09:08:52 -08:00
rtrap.S [SPARC64]: Fix userland FPU state corruption. 2005-10-07 13:30:49 -07:00
sbus.c [PATCH] unpaged: fix sound Bad page states 2005-11-22 09:13:43 -08:00
semaphore.c
setup.c [PATCH] sparc64: task_thread_info() 2006-01-12 09:08:52 -08:00
signal32.c [SPARC64] mm: don't re-evaluate *ptep 2005-11-07 14:08:46 -08:00
signal.c [PATCH] convert signal handling of NODEFER to act like other Unix boxes. 2005-08-29 10:03:11 -07:00
smp.c [PATCH] sparc64: task_thread_info() 2006-01-12 09:08:52 -08:00
sparc64_ksyms.c [PATCH] dump_thread() cleanup 2006-01-10 08:01:25 -08:00
starfire.c
sunos_ioctl32.c [SPARC]: Kill remaining kbio.h references. 2005-11-07 14:12:21 -08:00
sys32.S [SPARC64]: Fix fault handling in unaligned trap handler. 2005-09-28 20:41:45 -07:00
sys_sparc32.c [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
sys_sparc.c
sys_sunos32.c [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
systbls.S Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6 2006-01-10 08:28:53 -08:00
time.c [SPARC64]: Eliminate race condition reading Hummingbird STICK register 2006-01-17 15:21:01 -08:00
trampoline.S [SPARC64]: Replace cheetah+ code patching with variables. 2005-10-04 15:23:20 -07:00
traps.c [PATCH] sparc64: task_stack_page() 2006-01-12 09:08:52 -08:00
ttable.S [SPARC64]: Revamp Spitfire error trap handling. 2005-08-29 12:45:11 -07:00
una_asm.S [SPARC64]: Fix fault handling in unaligned trap handler. 2005-09-28 20:41:45 -07:00
unaligned.c [SPARC64]: Fix fault handling in unaligned trap handler. 2005-09-28 20:41:45 -07:00
us2e_cpufreq.c [PATCH] kfree cleanup: arch 2005-11-07 07:54:06 -08:00
us3_cpufreq.c [PATCH] kfree cleanup: arch 2005-11-07 07:54:06 -08:00
vmlinux.lds.S [SPARC]: Use STABS_DEBUG and DWARF_DEBUG macros in vmlinux.lds.S 2005-12-28 13:22:54 -08:00
winfixup.S [SPARC64]: Replace cheetah+ code patching with variables. 2005-10-04 15:23:20 -07:00