Skip to content
  • Ralf Baechle's avatar
    [MIPS] Sibyte: Fix race in sb1250_gettimeoffset(). · a904f747
    Ralf Baechle authored
    
        
    From Dave Johnson <djohnson+linuxmips@sw.starentnetworks.com>:
        
    sb1250_gettimeoffset() simply reads the current cpu 0 timer remaining
    value, however once this counter reaches 0 and the interrupt is raised,
    it immediately resets and begins to count down again.
        
    If sb1250_gettimeoffset() is called on cpu 1 via do_gettimeofday() after
    the timer has reset but prior to cpu 0 processing the interrupt and
    taking write_seqlock() in timer_interrupt() it will return a full value
    (or close to it) causing time to jump backwards 1ms. Once cpu 0 handles
    the interrupt and timer_interrupt() gets far enough along it will jump
    forward 1ms.
        
    Fix this problem by implementing mips_hpt_*() on sb1250 using a spare
    timer unrelated to the existing periodic interrupt timers. It runs at
    1Mhz with a full 23bit counter.  This eliminated the custom
    do_gettimeoffset() for sb1250 and allowed use of the generic
    fixed_rate_gettimeoffset() using mips_hpt_*() and timerhi/timerlo.
        
    Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    a904f747