From: john stultz <johnstul@us.ibm.com>
To: Roman Zippel <zippel@linux-m68k.org>
Cc: Ulrich Windl <ulrich.windl@rz.uni-regensburg.de>,
Nishanth Aravamudan <nacc@us.ibm.com>,
benh@kernel.crashing.org, Anton Blanchard <anton@samba.org>,
frank@tuxrocks.com, George Anzinger <george@mvista.com>,
lkml <linux-kernel@vger.kernel.org>
Subject: Re: [RFC - 0/9] Generic timekeeping subsystem (v. B5)
Date: Tue, 23 Aug 2005 16:14:07 -0700 [thread overview]
Message-ID: <1124838847.20617.11.camel@cog.beaverton.ibm.com> (raw)
In-Reply-To: <Pine.LNX.4.61.0508232321530.3728@scrub.home>
On Tue, 2005-08-23 at 23:34 +0200, Roman Zippel wrote:
> Hi,
>
> On Tue, 23 Aug 2005, john stultz wrote:
>
> > In the case above, you're accumulating in fixed cycle intervals. This
> > does avoid having to do the mult/shift combo each interrupt, however
> > since you do not accumulate the entire interval, and there is some
> > sub-tick remainder in cycle_offset. We have to ensure that that sub-tick
> > remainder is accumulated at the next interrupt using the same ntp
> > adjustment it would use in a call to gettimeofday() just prior to this
> > interrupt.
>
> Look closer and you'll notice that the cycle_offset remainder isn't lost. :)
I'm not saying its lost, but that it is accumulated differently then how
it would be used in gettimeofday().
So a somewhat lengthy and exaggerated example with a clock that has 2
cycles per milisecond, HZ=1000 and a 0ppm adjustment to begin with.
I'm assuming gettimeofday()/clock_gettime() looks something like:
xtime + (get_cycles()-last_update)*(mult+ntp_adj)>>shift
Using (1,000,000, 1) for the (mult,shift) pair.
So first, the easy case:
time(0): gettimeofday: 0 + (0 - 0)*(1M+0)>>1 = 0 ns
time(1): gettimeofday: 0 + (1 - 0)*(1M+0)>>1 = 0.5M ns
time(2): gettimeofday: 0 + (2 - 0)*(1M+0)>>1 = 1M ns
time(2): interrupt
time(2): gettimeofday: 1M + (2 - 2)*(1M+0)>>1 = 1M ns
time(3): gettimeofday: 1M + (3 - 2)*(1M+0)>>1 = 1.5M ns
Now, lets look at how we deal with ticks that arrive late:
time(6): gettimeofday: 2M + (6 - 4)*(1M+0)>>1 = 3M ns
time(7): gettimeofday: 2M + (7 - 4)*(1M+0)>>1 = 3.5M ns
time(7): interrupt
time(7): gettimeofday: 3M + (7 - 6)*(1M+0)>>1 = 3.5M ns
time(8): gettimeofday: 3M + (8 - 6)*(1M+0)>>1 = 4M ns
So everything looks ducky. Now on to when we make NTP adjustments.
time(11): gettimeofday: 5M + (11 - 10)*(1M+0)>>1 = 5.5M ns
time(12): gettimeofday: 5M + (12 - 10)*(1M+0)>>1 = 6M ns
time(12): interrupt (set ntp_adj = 1000 ~= 500ppm)
time(12): gettimeofday: 6M + (12 - 12)*(1M+ 1000)>>1 = 6M ns
time(13): gettimeofday: 6M + (13 - 12)*(1M+ 1000)>>1 = 6,500,500 ns
time(14): gettimeofday: 6M + (14 - 12)*(1M+ 1000)>>1 = 7,001,000 ns
Still doing fine. Now lets look at doing NTP adjustments while ticks
arrive late:
time(15): gettimeofday: 7,001k + (15 - 14)*(1M+ 1000)>>1 = 7,501,500 ns
time(16): gettimeofday: 7,001k + (16 - 14)*(1M+ 1000)>>1 = 8,002,000 ns
time(17): gettimeofday: 7,001k + (17 - 14)*(1M+ 1000)>>1 = 8,502,500 ns
time(17): interrupt, (set ntp_adj = 0ppm)
time(17): gettimeofday: 8,002k + (17 - 16)*(1M+ 0)>>1 = 8,502,000 ns
And bang, we have a 500 ns time inconsistency!
And that was only with a tick arriving 1/2 a tick late. I've dealt with
systems that on occasion miss 30ms worth of ticks due to SMI crazyness.
This is why I accumulate the entire interval with NTP adjustments
consistently between the timer tick and gettimeofday.
Right now I'm not sure how to work around this issue with your proposal,
but let me know if you have an idea or I'm missing some other subtlety.
thanks
-john
next prev parent reply other threads:[~2005-08-23 23:14 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-11 1:21 [RFC - 0/13] NTP cleanup work " john stultz
2005-08-11 1:23 ` [RFC][PATCH - 1/13] NTP cleanup: Move NTP code into ntp.c john stultz
2005-08-11 1:25 ` [RFC][PATCH - 2/13] NTP cleanup: Move arches to new ntp interfaces john stultz
2005-08-11 1:26 ` [RFC][PATCH - 3/13] NTP cleanup: Remove unused NTP PPS code john stultz
2005-08-11 1:27 ` [RFC][PATCH - 4/13] NTP cleanup: Breakup ntp_adjtimex() john stultz
2005-08-11 1:28 ` [RFC][PATCH - 5/13] NTP cleanup: Break out leapsecond processing john stultz
2005-08-11 1:28 ` [RFC][PATCH - 6/13] NTP cleanup: Clean up ntp_adjtimex() arguement checking john stultz
2005-08-11 1:31 ` [RFC][PATCH - 7/13] NTP cleanup: Cleanup signed shifting logic john stultz
2005-08-11 1:31 ` [RFC][PATCH - 8/13] NTP cleanup: Integrate second_overflow() logic john stultz
2005-08-11 1:33 ` [RFC][PATCH - 9/13] NTP cleanup: Improve NTP variable names john stultz
2005-08-11 1:33 ` [RFC][PATCH - 10/13] NTP cleanup: Use ntp_lock instead of xtime_lock john stultz
2005-08-11 1:35 ` [RFC][PATCH - 11/13] NTP cleanup: Introduce PPM adjustment variables john stultz
2005-08-11 1:36 ` [RFC][PATCH - 12/13] NTP cleanup: cleanup ntp_advance() adjtime code john stultz
2005-08-11 1:38 ` [RFC][PATCH - 13/13] NTP cleanup: drop time_phase and time_adj add copyright john stultz
2005-08-16 2:08 ` [RFC][PATCH - 4/13] NTP cleanup: Breakup ntp_adjtimex() john stultz
2005-08-11 2:13 ` [RFC - 0/9] Generic timekeeping subsystem (v. B5) john stultz
2005-08-11 2:14 ` [PATCH 1/9] Timesource management code john stultz
2005-08-11 2:16 ` [PATCH 2/9] Generic timekeeping core subsystem john stultz
2005-08-11 2:18 ` [PATCH 3/9] Generic timekeeping i386 arch specific changes, part 1 john stultz
2005-08-11 2:19 ` [PATCH 4/9] generic timekeeping i386 arch specific changes, part 2 john stultz
2005-08-11 2:20 ` [PATCH 5/9] generic timekeeping i386 arch specific changes, part 3 john stultz
2005-08-11 2:21 ` [PATCH 6/9] generic timekeeping i386 arch specific changes, part 4 john stultz
2005-08-11 2:23 ` [PATCH 7/9] generic timekeeping i386 arch specific changes, part 5 john stultz
2005-08-11 2:24 ` [PATCH 8/9] generic timekeeping i386 arch specific changes, part 6 john stultz
2005-08-11 2:25 ` [PATCH 9/9] generic timekeeping i386 specific timesources john stultz
2005-08-11 2:32 ` [RFC - 0/9] Generic timekeeping subsystem (v. B5) Lee Revell
2005-08-11 2:39 ` john stultz
2005-08-11 2:44 ` Lee Revell
2005-08-11 6:17 ` Ulrich Windl
2005-08-11 2:37 ` [RFC] Cumulative NTP cleanujp and generic timekeeping patch (v B5) john stultz
2005-08-15 22:14 ` [RFC - 0/9] Generic timekeeping subsystem (v. B5) Roman Zippel
2005-08-16 0:10 ` john stultz
2005-08-16 18:25 ` Christoph Lameter
2005-08-16 23:48 ` john stultz
2005-08-17 0:14 ` Christoph Lameter
2005-08-17 0:17 ` john stultz
2005-08-17 0:21 ` Christoph Lameter
2005-08-17 6:08 ` Ulrich Windl
2005-08-17 14:07 ` Christoph Lameter
2005-08-17 0:28 ` Roman Zippel
2005-08-17 1:17 ` john stultz
2005-08-17 7:40 ` Ulrich Windl
2005-08-19 0:27 ` Roman Zippel
2005-08-20 2:32 ` john stultz
2005-08-21 23:19 ` Roman Zippel
2005-08-22 18:57 ` john stultz
2005-08-23 11:30 ` Roman Zippel
2005-08-23 18:52 ` john stultz
2005-08-23 20:51 ` john stultz
2005-08-23 21:34 ` Roman Zippel
2005-08-23 23:14 ` john stultz [this message]
2005-08-23 23:54 ` Roman Zippel
2005-08-24 0:29 ` George Anzinger
2005-08-24 20:36 ` john stultz
2005-08-24 23:46 ` George Anzinger
2005-08-25 0:42 ` john stultz
2005-08-25 1:44 ` George Anzinger
2005-08-25 2:13 ` john stultz
2005-08-24 6:34 ` Ulrich Windl
2005-08-24 9:47 ` Roman Zippel
2005-08-24 18:00 ` john stultz
2005-08-24 18:48 ` Roman Zippel
2005-08-24 19:15 ` john stultz
2005-08-24 19:49 ` Roman Zippel
2005-08-24 22:40 ` john stultz
2005-08-25 0:45 ` Roman Zippel
2005-08-25 18:08 ` john stultz
2005-08-17 19:03 ` George Anzinger
2005-08-15 22:12 ` [RFC - 0/13] NTP cleanup work " Roman Zippel
2005-08-15 22:46 ` john stultz
2005-08-17 0:10 ` Roman Zippel
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=1124838847.20617.11.camel@cog.beaverton.ibm.com \
--to=johnstul@us.ibm.com \
--cc=anton@samba.org \
--cc=benh@kernel.crashing.org \
--cc=frank@tuxrocks.com \
--cc=george@mvista.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nacc@us.ibm.com \
--cc=ulrich.windl@rz.uni-regensburg.de \
--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
all inboxes | Powered by JetHome®