From: john stultz <johnstul@us.ibm.com>
To: Roman Zippel <zippel@linux-m68k.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>, Steven Rostedt <rostedt@goodmis.org>
Subject: Re: [PATCH] correct inconsistent ntp interval/tick_length usage
Date: Tue, 29 Jan 2008 18:14:23 -0800 [thread overview]
Message-ID: <1201659263.6766.40.camel@localhost> (raw)
In-Reply-To: <Pine.LNX.4.64.0801290439480.17507@scrub.home>
On Tue, 2008-01-29 at 05:02 +0100, Roman Zippel wrote:
> Hi,
>
> On Mon, 28 Jan 2008, john stultz wrote:
>
> > Regardless, current_tick_length() really is the base interval we're
> > using in the error accumulation loop, so it seems the cleanest interface
> > to use (just to avoid redundancy at least) when establishing the
> > clocksource's interval length. Or do you not agree?
>
> I see, what you need to use in timex.h for !CONFIG_NO_HZ is:
>
> #define NTP_INTERVAL_LENGTH ((s64)LATCH * NSEC_PER_SEC) / (s64)CLOCK_TICK_RATE)
>
> this calculates the base length of a clock tick in nsec.
>
> current_tick_length() would only work during boot. If you switch clocks
> later, it would include random adjustments specific to the old clock.
Ah. Good point. How about the following, tested on x86_64 both with and
without CONFIG_NO_HZ?
Thanks for the review and feedback!
-john
Correct NTP drift caused by using inconsistent NTP_INTERVAL_LENGTHs in
clocksource initialization and error accumulation. This corrects a
280ppm drift seen on some systems using acpi_pm, and affects other
clocksources as well (likely to a lesser degree).
Signed-off-by: John Stultz <johnstul@us.ibm.com>
Index: linux/include/linux/timex.h
===================================================================
--- linux.orig/include/linux/timex.h
+++ linux/include/linux/timex.h
@@ -231,7 +231,13 @@ static inline int ntp_synced(void)
#else
#define NTP_INTERVAL_FREQ (HZ)
#endif
-#define NTP_INTERVAL_LENGTH (NSEC_PER_SEC/NTP_INTERVAL_FREQ)
+
+#define CLOCK_TICK_OVERFLOW (LATCH * HZ - CLOCK_TICK_RATE)
+#define CLOCK_TICK_ADJUST (((s64)CLOCK_TICK_OVERFLOW * NSEC_PER_SEC) / \
+ (s64)CLOCK_TICK_RATE)
+
+/* Because using NSEC_PER_SEC would be too easy */
+#define NTP_INTERVAL_LENGTH ((((s64)TICK_USEC*NSEC_PER_USEC*USER_HZ)+CLOCK_TICK_ADJUST)/NTP_INTERVAL_FREQ)
/* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */
extern u64 current_tick_length(void);
Index: linux/kernel/time/ntp.c
===================================================================
--- linux.orig/kernel/time/ntp.c
+++ linux/kernel/time/ntp.c
@@ -43,10 +43,6 @@ long time_freq; /* frequency offset (
static long time_reftime; /* time at last adjustment (s) */
long time_adjust;
-#define CLOCK_TICK_OVERFLOW (LATCH * HZ - CLOCK_TICK_RATE)
-#define CLOCK_TICK_ADJUST (((s64)CLOCK_TICK_OVERFLOW * NSEC_PER_SEC) / \
- (s64)CLOCK_TICK_RATE)
-
static void ntp_update_frequency(void)
{
u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ)
next prev parent reply other threads:[~2008-01-30 2:14 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-24 2:38 [PATCH] correct inconsistent ntp interval/tick_length usage john stultz
2008-01-24 9:14 ` Valdis.Kletnieks
2008-01-25 14:07 ` Roman Zippel
2008-01-29 2:28 ` john stultz
2008-01-29 4:02 ` Roman Zippel
2008-01-30 2:14 ` john stultz [this message]
2008-01-31 1:55 ` Roman Zippel
2008-01-31 2:16 ` john stultz
2008-01-31 5:02 ` Roman Zippel
2008-02-02 1:02 ` John Stultz
2008-02-08 17:33 ` Roman Zippel
2008-02-09 2:17 ` john stultz
2008-02-09 4:47 ` Roman Zippel
2008-02-09 5:04 ` Andrew Morton
2008-02-09 14:13 ` Roman Zippel
2008-02-10 18:45 ` Roman Zippel
2008-02-12 0:09 ` john stultz
2008-02-12 14:36 ` Roman Zippel
2008-02-14 4:36 ` john stultz
2008-02-16 4:24 ` Roman Zippel
2008-02-19 1:02 ` john stultz
2008-02-19 4:04 ` Roman Zippel
2008-02-20 1:50 ` john stultz
2008-02-20 17:08 ` Roman Zippel
2008-02-22 2:39 ` john stultz
2008-02-25 14:44 ` Roman Zippel
2008-02-29 4:49 ` [PATCH] Remove obsolete CLOCK_TICK_ADJUST Roman Zippel
2008-02-29 6:25 ` Ray Lee
2008-02-29 13:31 ` Roman Zippel
2008-02-29 22:08 ` Andrew Morton
2008-02-29 22:27 ` Roman Zippel
2008-02-29 22:38 ` Andrew Morton
2008-02-29 23:11 ` john stultz
2008-02-29 23:11 ` john stultz
2008-03-02 4:03 ` Roman Zippel
2008-02-29 18:54 ` [PATCH] correct inconsistent ntp interval/tick_length usage Jörg-Volker Peetz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1201659263.6766.40.camel@localhost \
--to=johnstul@us.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rostedt@goodmis.org \
--cc=zippel@linux-m68k.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.