timekeeping/ntp: Determine the multiplier directly from NTP tick length
authorMiroslav Lichvar <mlichvar@redhat.com>
Fri, 9 Mar 2018 18:42:48 +0000 (10:42 -0800)
committerIngo Molnar <mingo@kernel.org>
Sat, 10 Mar 2018 08:12:41 +0000 (09:12 +0100)
commit78b98e3c5a66d569a53b8f57b6a698f912794a43
treed4306491e8e4ce50d1fd8decfac0e5c9e14fc8cd
parentc2cda2a5bda9f1369c9d1ab54a20571c13cf2743
timekeeping/ntp: Determine the multiplier directly from NTP tick length

When the length of the NTP tick changes significantly, e.g. when an
NTP/PTP application is correcting the initial offset of the clock, a
large value may accumulate in the NTP error before the multiplier
converges to the correct value. It may then take a very long time (hours
or even days) before the error is corrected. This causes the clock to
have an unstable frequency offset, which has a negative impact on the
stability of synchronization with precise time sources (e.g. NTP/PTP
using hardware timestamping or the PTP KVM clock).

Use division to determine the correct multiplier directly from the NTP
tick length and replace the iterative approach. This removes the last
major source of the NTP error. The only remaining source is now limited
resolution of the multiplier, which is corrected by adding 1 to the
multiplier when the system clock is behind the NTP time.

Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Stephen Boyd <stephen.boyd@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1520620971-9567-3-git-send-email-john.stultz@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
include/linux/timekeeper_internal.h
kernel/time/timekeeping.c