lkml.org 
[lkml]   [2010]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:timers/core] ntp: Clamp PLL update interval
    Commit-ID:  8af3c153baf95374eff20a37f00c59a295b52756
    Gitweb: http://git.kernel.org/tip/8af3c153baf95374eff20a37f00c59a295b52756
    Author: Miroslav Lichvar <mlichvar@redhat.com>
    AuthorDate: Tue, 7 Sep 2010 16:43:46 +0200
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Thu, 9 Sep 2010 20:48:37 +0200

    ntp: Clamp PLL update interval

    Clamp update interval to reduce PLL gain with low sampling rate (e.g.
    intermittent network connection) to avoid instability.

    The clamp roughly corresponds to the loop time constant, it's 8 * poll
    interval for SHIFT_PLL 2 and 32 * poll interval for SHIFT_PLL 4. This
    gives good results without affecting the gain in normal conditions where
    ntpd skips only up to seven consecutive samples.

    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
    Acked-by: john stultz <johnstul@us.ibm.com>
    LKML-Reference: <1283870626-9472-1-git-send-email-mlichvar@redhat.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    kernel/time/ntp.c | 14 +++++++++++---
    1 files changed, 11 insertions(+), 3 deletions(-)

    diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
    index c631168..d232189 100644
    --- a/kernel/time/ntp.c
    +++ b/kernel/time/ntp.c
    @@ -149,10 +149,18 @@ static void ntp_update_offset(long offset)
    time_reftime = get_seconds();

    offset64 = offset;
    - freq_adj = (offset64 * secs) <<
    - (NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant));
    + freq_adj = ntp_update_offset_fll(offset64, secs);

    - freq_adj += ntp_update_offset_fll(offset64, secs);
    + /*
    + * Clamp update interval to reduce PLL gain with low
    + * sampling rate (e.g. intermittent network connection)
    + * to avoid instability.
    + */
    + if (unlikely(secs > 1 << (SHIFT_PLL + 1 + time_constant)))
    + secs = 1 << (SHIFT_PLL + 1 + time_constant);
    +
    + freq_adj += (offset64 * secs) <<
    + (NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant));

    freq_adj = min(freq_adj + time_freq, MAXFREQ_SCALED);


    \
     
     \ /
      Last update: 2010-09-09 20:55    [W:0.027 / U:61.476 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site