• john stultz's avatar
    time: Implement logarithmic time accumulation · a092ff0f
    john stultz authored
    Accumulating one tick at a time works well unless we're using NOHZ.
    Then it can be an issue, since we may have to run through the loop
    a few thousand times, which can increase timer interrupt caused
    latency.
    
    The current solution was to accumulate in half-second intervals
    with NOHZ. This kept the number of loops down, however it did
    slightly change how we make NTP adjustments. While not an issue
    with NTPd users, as NTPd makes adjustments over a longer period of
    time, other adjtimex() users have noticed the half-second
    granularity with which we can apply frequency changes to the clock.
    
    For instance, if a application tries to apply a 100ppm frequency
    correction for 20ms to correct a 2us offset, with NOHZ they either
    get no correction, or a 50us correction.
    
    Now, there will always be some granularity error for applying
    frequency corrections. However with users sensitive to this error
    have seen a 50-500x increase with NOHZ compared to running without
    NOHZ.
    
    So I figured I'd try another approach then just simply increasing
    the interval. My approach is to consume the time interval
    logarithmically. This reduces the number of times through the loop
    needed keeping latency down, while still preserving the original
    granularity error for adjtimex() changes.
    
    Further, this change allows us to remove the xtime_cache code
    (patch to follow), as xtime is always within one tick of the
    current time, instead of the half-second updates it saw before.
    
    An earlier version of this patch has been shipping to x86 users in
    the RedHat MRG releases for awhile without issue, but I've reworked
    this version to be even more careful about avoiding possible
    overflows if the shift value gets too large.
    Signed-off-by: default avatarJohn Stultz <johnstul@us.ibm.com>
    Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarJohn Kacur <jkacur@redhat.com>
    Cc: Clark Williams <williams@redhat.com>
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    LKML-Reference: <1254525473.7741.88.camel@localhost.localdomain>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    a092ff0f
timekeeping.c 23.3 KB