From: Grant Grundler <grundler@parisc-linux.org>
To: Carlos O'Donell <carlos@systemhalted.org>
Cc: parisc-linux <parisc-linux@lists.parisc-linux.org>
Subject: Re: [parisc-linux] [PATCH] timer_interrupt and gettimeoffset.
Date: Thu, 31 Aug 2006 15:46:50 -0600 [thread overview]
Message-ID: <20060831214650.GC16032@colo.lackof.org> (raw)
In-Reply-To: <119aab440608311152m28ef65f6ud3db46b12c59d3@mail.gmail.com>
On Thu, Aug 31, 2006 at 02:52:44PM -0400, Carlos O'Donell wrote:
...
> >> 2. No attempt is made to handle cr16 wrapping.
> >
> >The signed math was supposed to handle it.
> >I believe it did but forgot details since looking at
> >it a few years ago.
>
> That is *even* worse, signed arithmetic overflow is compiler
> implementation dependant. It's also therefore not very nice C code.
> The overflow case is in the middle of the 32-bit range now, where you
> had a very large positive number which wraps to a very large negative
> number. The gap is almost the entire 32-bit range, or 27 seconds on a
> 160Mhz box as we have shown already.
I think it's arbitrary where the overflow occurs.
Maybe unsigned math overflow is easier to visualize/understand.
At least it is for me.
> >I personally prefer to NOT use signed math in this case.
> >But that's honestly not a great reason to change this code.
> >I'd really prefer some evidence the kernel code is wrong.
>
> I agree, this patch was an attempt to provide an alternate
> implementation that made sense and was maintainer friendly. I believe
> we should be able to get this working better and handle the failures
> seen on the slower boxes.
Yes. I'm now pretty sure the fix for that will be in gettimeoffset()
and not in timer_interrupt(). But I agree the two functions are very
similar but have to handle slightly different corner cases.
> >13.065388 sec
> >30 Aug 23:52:04 ntpdate[14055]: step time server 195.234.188.26 offset
> >11.578574 sec
> >30 Aug 23:52:31 ntpdate[14058]: step time server 203.217.30.156 offset
> >13.954358 sec
> >...
>
> Technically it is implementation dependant, and can be as low as 1/2
> the peak instruction rate. In correcting timer_interrupt, I remember
> removing what I thought was a spurious 'clocktick' addition in the
> implementation.
I was thinking the opposite: I'm missing a "tick_elapsed" count
on each timer interrupt.
> Does cr16 *actuall* count at the instruction rate, or
> does it count at 1/2 rate?
I _believe_ all implementations count at the actual rate.
At least I'm not aware of any implementations that don't
count at the advertized clock speed.
...
> I think the detection of Scenario 3 is wrong in your patch, I'll
> epxlain further down in the code.
...
>
> >...
> >> I assert that 'gettimeoffset' should never return a negative value. It
> >> represents the postive adjustment accounting for the fact that we are
> >> *part* of the way through a tick.
> >
> >I have to think about this more. But I wonder if how "halftick" is
> >handled in timer_interrupt does not play well with this concept.
>
> There is a bug here because of this, you are right to be warry of the
> halftick adjustment. It is also needed in gettimeoffset, or "now" will
> appear before "next_tick" without wrapping.
Sorry - this didn't make sense. Can you provide an example?
For simplicity assume a 5 bit counter and pick the values
that illustrate your case.
> >Please review and see if I added any new bugs.
>
> There is 1 addtional bug.
...
> >+ /* Determine how much time elapsed. */
> >+ if (now > next_tick) {
> >+ /* Scenario 1: "now" is late. A bit late is normal. */
> >+ ticks_elapsed = (now - next_tick) / clocktick;
> >+ remainder = now - (ticks_elapsed * clocktick);
>
> What have you got against modulo?
Modulo is a division.
Division is much more expensive than integer multiplication.
Is there a way to do the division once _and_ get the remainder?
My assumption that integer multiplication is "cheaper"
could be wrong.
> The correct math is as follows.
>
> remainder = now - next_tick - ticks_elapsed * clocktick;
Erm, no. ticks_elapsed was calculated here:
ticks_elapsed = (now - next_tick) / clocktick;
(the line above.)
I'm taking advantage of truncation since this is integer division.
That make more sense?
> >+ /* "now" is either early or cr16 wrapped. */
> >+ if (~next_tick < clocktick) {
>
> Too clever for me :)
Now I'm worried. :)
I've already removed this code in the version I'm working on now.
...
> >+ } else {
> >+ /* "now" is either early or cr16 wrapped. */
> >+ if (next_next_tick < last_tick) {
>
> This could also use your clever "~next_tick < clocktick" trick.
> Remember this is only a heuristic to catch wrapping.
Yup - I'll post a new version that boots 64-bit correctly in a bit.
I've still not got the "wrapping" rules correct.
...
> Somwhere in thie function we need to makeup for the halftick...
Hrm. I need to think more about that. You might be right.
> Joel has already seen a BUG, which IMO is caused by gettimeoffset not
> taking into account the halftick.
ok. I was just looking at that.
thanks,
grant
_______________________________________________
parisc-linux mailing list
parisc-linux@lists.parisc-linux.org
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
next prev parent reply other threads:[~2006-08-31 21:46 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-30 4:48 [parisc-linux] [PATCH] timer_interrupt and gettimeoffset Carlos O'Donell
2006-08-31 6:53 ` Grant Grundler
2006-08-31 18:52 ` Carlos O'Donell
2006-08-31 21:46 ` Grant Grundler [this message]
2006-09-03 14:54 ` Carlos O'Donell
2006-09-03 19:55 ` Grant Grundler
2006-09-03 20:29 ` James Bottomley
2006-09-03 20:30 ` Carlos O'Donell
2006-09-03 21:22 ` John David Anglin
2006-09-01 22:48 ` Grant Grundler
2006-09-01 22:59 ` Grant Grundler
2006-09-06 6:29 ` [parisc-linux] [PATCH] timer_interrupt #5 Grant Grundler
[not found] ` <44FF2A69.5040102@scarlet.be>
[not found] ` <20060907001944.GA4407@colo.lackof.org>
[not found] ` <450188D8.5000501@scarlet.be>
2006-09-08 18:49 ` Grant Grundler
2006-09-23 0:41 ` John David Anglin
-- strict thread matches above, loose matches on Subject: below --
2006-08-30 16:38 Re:[parisc-linux] [PATCH] timer_interrupt and gettimeoffset Joel Soete
2006-08-30 16:52 ` [parisc-linux] " Grant Grundler
2006-08-30 20:23 ` Carlos O'Donell
2006-09-02 15:52 ` James Bottomley
2006-09-03 15:00 ` Carlos O'Donell
2006-09-03 15:17 ` James Bottomley
2006-09-03 16:14 ` James Bottomley
2006-09-03 19:31 ` Grant Grundler
2006-09-04 15:51 ` James Bottomley
2006-09-04 16:57 ` John David Anglin
2006-09-04 17:23 ` James Bottomley
2006-09-04 19:12 ` John David Anglin
2006-09-04 21:21 ` Grant Grundler
2006-09-04 22:47 ` James Bottomley
2006-09-04 23:52 ` John David Anglin
2006-09-05 5:12 ` Grant Grundler
2006-09-05 15:53 ` James Bottomley
2006-09-05 22:49 ` Grant Grundler
2006-09-05 22:59 ` James Bottomley
2006-09-05 23:41 ` John David Anglin
2006-09-06 0:24 ` John David Anglin
2006-09-03 19:38 ` Grant Grundler
2006-09-03 19:59 ` John David Anglin
2006-09-04 0:09 ` Grant Grundler
2006-09-04 0:58 ` John David Anglin
2006-09-04 3:51 ` John David Anglin
2006-09-04 15:49 ` James Bottomley
[not found] <44FDE867.3090204@scarlet.be>
2006-09-05 21:35 ` John David Anglin
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=20060831214650.GC16032@colo.lackof.org \
--to=grundler@parisc-linux.org \
--cc=carlos@systemhalted.org \
--cc=parisc-linux@lists.parisc-linux.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.