• Richard Mortimer's avatar
    [SPARC64]: Eliminate race condition reading Hummingbird STICK register · 9eb3394b
    Richard Mortimer authored
    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: default avatarRichard Mortimer <richm@oldelvet.org.uk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9eb3394b
time.c 28.9 KB