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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox