From: Ingo Molnar <mingo@elte.hu>
To: John Stultz <johnstul@us.ibm.com>
Cc: Linux-kernel <linux-kernel@vger.kernel.org>,
Clark Williams <williams@redhat.com>,
Steven Rostedt <srostedt@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
Roman Zippel <zippel@linux-m68k.org>
Subject: Re: [RFC][PATCH] Logarithmic Timekeeping Accumulation
Date: Tue, 24 Mar 2009 15:13:38 +0100 [thread overview]
Message-ID: <20090324141338.GF32043@elte.hu> (raw)
In-Reply-To: <1237858102.7068.20.camel@jstultz-laptop>
* John Stultz <johnstul@us.ibm.com> wrote:
> Accumulating one tick at a time works well unless we're using
> NOHZ. Then it can be an issue, since we may have to run through
> the loop a few thousand times, which can increase timer interrupt
> caused latency.
>
> The current solution was to accumulate in half-second intervals
> with NOHZ. This kept the number of loops down, however it did
> slightly change how we make NTP adjustments. While not an issue
> with NTPd users, as NTPd makes adjustments over a longer period of
> time, other adjtimex() users have noticed the half-second
> granularity with which we can apply frequency changes to the
> clock.
>
> For instance, if a application tries to apply a 100ppm frequency
> correction for 20ms to correct a 2us offset, with NOHZ they either
> get no correction, or a 50us correction.
>
> Now, there will always be some granularity error for applying
> frequency corrections. However with users sensitive to this error
> have seen a 50-500x increase with NOHZ compared to running without
> NOHZ.
>
> So I figured I'd try another approach then just simply increasing
> the interval. My approach is to consume the time interval
> logarithmically. This reduces the number of times through the loop
> needed keeping latency down, while still preserving the original
> granularity error for adjtimex() changes.
>
> This has been lightly tested and appears to work correctly, but
> I'd appreciate any feedback or comments on the idea and code.
>
> Signed-off-by: John Stultz <johnstul@us.ibm.com>
Hm, we used to have some sort of problem with a similar patch in the
past.
> /* accumulate error between NTP and clock interval */
> - clock->error += tick_length;
> - clock->error -= clock->xtime_interval << (NTP_SCALE_SHIFT - clock->shift);
> + clock->error += tick_length << shift;
> + clock->error -= (clock->xtime_interval
> + << (NTP_SCALE_SHIFT - clock->shift))
> + << shift;
Why not:
clock->error -= clock->xtime_interval
<< (NTP_SCALE_SHIFT - clock->shift + shift);
?
> + if (shift > 0) /*don't roll under!*/
> + shift--;
(nit: watch out the comment style)
that bit looks a bit messy. We estimated the shift:
+ while (offset > (clock->cycle_interval << shift))
+ shift++;
+ shift--;
can it really ever roll under in this loop:
while (offset >= clock->cycle_interval) {
...
offset -= clock->cycle_interval << shift;
?
Ingo
next prev parent reply other threads:[~2009-03-24 14:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-24 1:28 [RFC][PATCH] Logarithmic Timekeeping Accumulation John Stultz
2009-03-24 14:13 ` Ingo Molnar [this message]
2009-03-25 0:14 ` john stultz
2009-03-25 8:25 ` Ingo Molnar
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=20090324141338.GF32043@elte.hu \
--to=mingo@elte.hu \
--cc=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=srostedt@redhat.com \
--cc=tglx@linutronix.de \
--cc=williams@redhat.com \
--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