diff options
author | Richard Mortimer <richm@oldelvet.org.uk> | 2006-01-17 15:21:01 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-01-17 15:21:01 -0800 |
commit | 9eb3394bf2037120881a8846bc67064f49325366 (patch) | |
tree | 6782663f5b5a13cf8f98c4341637322650b42f9a /arch/sparc/mm | |
parent | 2664b25051f7ab96b22b199aa2f5ef6a949a4296 (diff) | |
download | kernel-crypto-9eb3394bf2037120881a8846bc67064f49325366.tar.gz kernel-crypto-9eb3394bf2037120881a8846bc67064f49325366.tar.xz kernel-crypto-9eb3394bf2037120881a8846bc67064f49325366.zip |
[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>
Diffstat (limited to 'arch/sparc/mm')
0 files changed, 0 insertions, 0 deletions