• John Stultz's avatar
    timekeeping: Cap adjustments so they don't exceed the maxadj value · ec02b076
    John Stultz authored
    Thus its been occasionally noted that users have seen
    confusing warnings like:
    
        Adjusting tsc more than 11% (5941981 vs 7759439)
    
    We try to limit the maximum total adjustment to 11% (10% tick
    adjustment + 0.5% frequency adjustment). But this is done by
    bounding the requested adjustment values, and the internal
    steering that is done by tracking the error from what was
    requested and what was applied, does not have any such limits.
    
    This is usually not problematic, but in some cases has a risk
    that an adjustment could cause the clocksource mult value to
    overflow, so its an indication things are outside of what is
    expected.
    
    It ends up most of the reports of this 11% warning are on systems
    using chrony, which utilizes the adjtimex() ADJ_TICK interface
    (which allows a +-10% adjustment). The original rational for
    ADJ_TICK unclear to me but my assumption it was originally added
    to allow broken systems to get a big constant correction at boot
    (see adjtimex userspace package for an example) which would allow
    the system to work w/ ntpd's 0.5% adjustment limit.
    
    Chrony uses ADJ_TICK to make very aggressive short term corrections
    (usually right at startup). Which push us close enough to the max
    bound that a few late ticks can cause the internal steering to push
    past the max adjust value (tripping the warning).
    
    Thus this patch adds some extra logic to enforce the max adjustment
    cap in the internal steering.
    
    Note: This has the potential to slow corrections when the ADJ_TICK
    value is furthest away from the default value. So it would be good to
    get some testing from folks using chrony, to make sure we don't
    cause any troubles there.
    
    Cc: Miroslav Lichvar <mlichvar@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Tested-by: default avatarMiroslav Lichvar <mlichvar@redhat.com>
    Reported-by: default avatarAndy Lutomirski <luto@kernel.org>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    ec02b076
timekeeping.c 56.2 KB