Re: [PATCH] New x86_64 time code for 2.5.70

john stultz (johnstul@us.ibm.com)
11 Jun 2003 17:33:55 -0700


On Wed, 2003-06-11 at 14:36, Bryan O'Sullivan wrote:
> On Wed, 2003-06-11 at 14:23, john stultz wrote:
>
> > Hmmm. Thats likely part to blame for the lost-ticks code not working. I
> > believe tick_usec is calculated USER_HZ rather then HZ, so you'll be off
> > by an order of magnitude. I ran into the exact same problem.
>
> Unlikely. On my systems, the offset values are off by three orders of
> magnitude, and are always negative. There's a more basic error
> somewhere before that test.

Actually it was related. Right before the lines I quoted you subtract
tick_usec from the offset calculation. Since tick_usec is 10,000 rather
then 1,000, offset goes negative and bad stuff ensues.

This patch applies on top of Bryan's patch, and solves the major time
inconsistencies I was seeing earlier. I don't like that I still have to
have the sanity check on offset to ensure it doesn't go negative
(frequently I get offsets of -1), and that along with the fact that I'm
seeing a steady drift forward on every kernel I've run (2.4/2.5) makes
me think that the timer interrupt frequency may be a bit higher then we
intend. Might just be the dev hardware I'm running on, though.

I'm also got some cleanup changes I'd like to make, but I'll wait until
after things work to polish that stuff up.

Let me know if you have any issues with this patch.

thanks
-john

diff -Nru a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c
--- a/arch/x86_64/kernel/time.c Wed Jun 11 17:28:07 2003
+++ b/arch/x86_64/kernel/time.c Wed Jun 11 17:28:07 2003
@@ -254,11 +254,14 @@
vxtime.last = offset;
} else {
offset = (((tsc - vxtime.last_tsc) *
- vxtime.tsc_quot) >> 32) - tick_usec;
+ vxtime.tsc_quot) >> 32) - (USEC_PER_SEC/HZ);
+ /* sanity check on offset */
+ if(offset < 0)
+ offset = 0;

- if (offset > tick_usec) {
- lost = offset / tick_usec;
- offset %= tick_usec;
+ if (offset > (USEC_PER_SEC/HZ)) {
+ lost = offset / (USEC_PER_SEC/HZ);
+ offset %= (USEC_PER_SEC/HZ);
}

vxtime.last_tsc = tsc - vxtime.quot * delay / vxtime.tsc_quot;
@@ -275,10 +278,7 @@
"tick(s)! (rip %016lx)\n",
(offset - vxtime.last) / hpet_tick - 1,
regs->rip);
- // XXX The accounting of lost ticks is way off right
- // now. -bos
-
- // jiffies += lost;
+ jiffies += lost;
}

/*

-
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/