• John Stultz's avatar
    clocksource: Avoid selecting mult values that might overflow when adjusted · d65670a7
    John Stultz authored
    For some frequencies, the clocks_calc_mult_shift() function will
    unfortunately select mult values very close to 0xffffffff.  This
    has the potential to overflow when NTP adjusts the clock, adding
    to the mult value.
    
    This patch adds a clocksource.maxadj value, which provides
    an approximation of an 11% adjustment(NTP limits adjustments to
    500ppm and the tick adjustment is limited to 10%), which could
    be made to the clocksource.mult value. This is then used to both
    check that the current mult value won't overflow/underflow, as
    well as warning us if the timekeeping_adjust() code pushes over
    that 11% boundary.
    
    v2: Fix max_adjustment calculation, and improve WARN_ONCE
    messages.
    
    v3: Don't warn before maxadj has actually been set
    
    CC: Yong Zhang <yong.zhang0@gmail.com>
    CC: David Daney <ddaney.cavm@gmail.com>
    CC: Thomas Gleixner <tglx@linutronix.de>
    CC: Chen Jie <chenj@lemote.com>
    CC: zhangfx <zhangfx@lemote.com>
    CC: stable@kernel.org
    Reported-by: default avatarChen Jie <chenj@lemote.com>
    Reported-by: default avatarzhangfx <zhangfx@lemote.com>
    Tested-by: default avatarYong Zhang <yong.zhang0@gmail.com>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    d65670a7
timekeeping.c 29.8 KB