From: George Anzinger <george@mvista.com>
To: john stultz <johnstul@us.ibm.com>
Cc: Roman Zippel <zippel@linux-m68k.org>,
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, lkml <linux-kernel@vger.kernel.org>
Subject: Re: [RFC - 0/9] Generic timekeeping subsystem (v. B5)
Date: Wed, 24 Aug 2005 18:44:29 -0700 [thread overview]
Message-ID: <430D227D.2070001@mvista.com> (raw)
In-Reply-To: <1124930555.20820.132.camel@cog.beaverton.ibm.com>
john stultz wrote:
> On Wed, 2005-08-24 at 16:46 -0700, George Anzinger wrote:
>
>>john stultz wrote:
>>
>>>On Tue, 2005-08-23 at 17:29 -0700, George Anzinger wrote:
>>>
>>>
>>>>Roman Zippel wrote:
>>>>
>>>>
>>>>>Hi,
>>>>>
>>>>>On Tue, 23 Aug 2005, john stultz wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>I'm assuming gettimeofday()/clock_gettime() looks something like:
>>>>>> xtime + (get_cycles()-last_update)*(mult+ntp_adj)>>shift
>>>>>
>>>>>
>>>>>Where did you get the ntp_adj from? It's not in my example.
>>>>>gettimeofday() was in the previous mail: "xtime + (cycle_offset * mult +
>>>>>error) >> shift". The difference between system time and reference
>>>>>time is really important. gettimeofday() returns the system time, NTP
>>>>>controls the reference time and these two are synchronized regularly.
>>>>>I didn't see that anywhere in your example.
>>>>>
>>>
>>>
>>>>If I read your example right, the problem is when the NTP adjustment
>>>>changes while the two clocks are out of sync (because of a late tick).
>>>
>>>
>>>Not quite. The issue that I'm trying to describe is that if, we
>>>inconsistently calculate time intervals in gettimeofday and the timer
>>>interrupt, we have the possibility for time inconsistencies.
>>>
>>>The trivial example using the current code would be something like:
>>>
>>>Again with my 2 cyc per tick clock, HZ=1000.
>>>
>>>gettimeofday():
>>> xtime + offset_ns
>>>
>>>timer_interrupt:
>>> xtime += tick_length + ntp_adj
>>> offset_ns = 0
>>>
>>>0: gettimeofday: 0 + 0 = 0 ns
>>>1: gettimeofday: 0 + 500k ns = 500k ns
>>>2: gettimeofday: 0 + 1M ns = 1M ns
>>>2: timer_interrupt:
>>>2: gettimeofday: 1M ns + 0 ns = 1M ns
>>>3: gettimeofday: 1M ns + 500k ns = 1.5M ns
>>>4: gettimeofday: 1M ns + 1M ns = 2 ns
>>>4: timer_interrupt (using -500ppm adjustment)
>>>4: gettimeofday: 1,999,500 ns + 0 ns = 1,999,500 ns
>>>
>>
>>At point 4 you are introducing a NEW ntp adjustment. This, I submit,
>>needs to actually have been introduced to the system prior to the
>>interrupt at point 2 with the first xtime change at point 4. However,
>>gettimeofday() should be aware of it from the interrupt at point 2 and
>>be doing corrections from that time forward. Thus when the point 4
>>interrutp happens xtime will be the same at the gettimeofday a ns earlier.
>
>
> Yes, clearly a forward knowledge of the NTP adjustment is necessary for
> gettimeofday(), because after the NTP adjustment has been accumulated
> into xtime, there's nothing left for gettimeofday to adjust (its already
> been applied). :)
>
>
>
>>Likewise, gettimeofday() needs to know when to stop apply the correction
>>so that if a tick is late, it will apply the correction only for those
>>times that it was needed. This, could be done by figuring the offset
>>thusly:
>>
>>offset = (offset from last tick to end of ntp period * ntp_adj1) +
>>(offset from end of ntp period to now)
>
>
> Well, in my example, the ntp_adjustment is a fixed nanosecond offset, so
> it would be added to the nanosecond offset from the last tick (which is
> how the current code works). If you are doing scaling (as you have in
> the equation above), then the problem goes away, since you can apply the
> adjustment consistently through any interval.
Until the end of the correction time...
>
>
>>I suppose it is possible that the latter part of the offset is also
>>under a different ntp correction which would mean a "* ntp_adj2" is
>>needed.
>
>
> Ok, so your forcing gettimeofday to be interval aware, so its applying
> different fixed NTP adjustments to different chunks of the current
> interval. The issue of course is if you're using fixed adjustments, is
> that you have to have n ntp adjustments for n intervals, or you have to
> apply the same ntp adjustment to multiple intervals.
Uh, are you saying that one ntpd call can set up several different
adjustments? I was assuming that any given call would set up either a
fixed adjustment for ever or a fixed adjustment to be applied for a
fixed number of ticks (or until so much correcting was done, which, in
the end is the same thing at this point in the code).
If ntpd has to come back to change the adjustment, I am assuming that
some kernel action can be taken at that time to sync the xtime clock and
the gettimeofday reading of it. I.e. we would only have to keep track
of one adjustment with a possible pre specified end time.
>
>
>
>>I would argue that only two terms are needed here regardless of
>>how late a tick is. This is because, I would expect the ntp system call
>>to sync the two clocks. This means in your example, the ntp call would
>>have been made at, or prior to the timer interrupt at 2 and this is the
>>same edge that gettimeofday is to used to start applying the correction.
>
>
> If you argue that we only need two adjustments, why not argue for only
> one? You're saying have one adjustment that you apply for the first
> tick's worth of time, and a second adjustment that you apply for the
> following N ticks' worth of time in the interval. Why the odd base
> case?
Correct me if I am wrong here, but I am assuming that ntpd can ask for
an adjustment of X amount which the kernel changes into N adjustments of
X/N amount spread over the next N ticks. This means that, once we have
done N ticks, we MUST stop doing the correction. Life would be easier
if ntpd only asked for rate changes which are to be applied until the
next ntpd call (which, as I understand it, it can ALSO do). Of course,
the issue of missed ticks kicks in here and is the ONLY reason we need
to do two corrections, i.e. we need only one ntp correction if we have
not missed a tick.
>
>
>
>>>>It would appear that gettimeofday would need to know that the NTP
>>>>adjustment is changing (and to what). It would also appear that this
>>>>is known by the ntp code and could be made available to gettimeofday.
>>>>If it is changing due to an NTP call, that system call, itself,
>>>>should/must force synchronization. So the only case gettimeofday needs
>>>>to worry/know about is that an adjustment is to change at time X to
>>>>value Y. Also, me thinks there is only one such change that can be
>>>>present at any given time.
>>>
>>>
>>>Well, in many arches gettimeofday() works around the above issue by
>>>capping the offset_ns value as such:
>>
>>I think this may have been done with only usec gettimeofday. Now that
>>we have clock_gettime() returning nsec, we need to be a bit more careful.
>
>
> Indeed.
>
> thanks
> -john
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
--
George Anzinger george@mvista.com
HRT (High-res-timers): http://sourceforge.net/projects/high-res-timers/
next prev parent reply other threads:[~2005-08-25 1:44 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 (v. B5) 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
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 [this message]
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=430D227D.2070001@mvista.com \
--to=george@mvista.com \
--cc=anton@samba.org \
--cc=benh@kernel.crashing.org \
--cc=frank@tuxrocks.com \
--cc=johnstul@us.ibm.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