Re: [RFC][PATCH] linux-2.4.21-pre4_tsc-lost-tick_A0

From: george anzinger (george@mvista.com)
Date: Thu Jan 30 2003 - 20:08:21 EST


john stultz wrote:
>
> All,
> Occasionally due to hardware or software, its possible to miss multiple
> timer interrupts. This can cause small inconsistencies in time as well
> as time drifting behind other systems.
>
> This patch checks each timer interrupt, using the TSC, if we have missed
> any ticks. Then if so, compensates jiffies for them. I have already
> submitted a patch for 2.4 which does this for the cyclone-timer based
> code, and I've been testing a version for 2.5 for all time sources (in
> -mm6, I believe).
>
> Since this code affects more users then the cyclone-based version, I
> want to be more careful and get more testing in the 2.5 tree before I
> submit this. However, just so people wanting it can play with it and
> test it themselves, I wanted to send this out for comments.
>
> I'm already somewhat cautious that loops_per_jiffy isn't going to cut it
> with this patch (I'm thinking fast_gettimeoffset_quotient would probably
> be better). So please let me know if you find any issues with this
> patch.

I think you are wondering about the "/", as am I. Possibly
a while loop, or, something like
fast_gettimeoffset_quotient, but scaled to do jiffies
instead of micro seconds. Still you SHOULD be doing this so
seldom that one wonders if the "/" is all that bad.

Another thing, possibly not so easily fixed given the
division between "arch" code and common code, but I would
like to see jiffies updated in only ONE place. With this
patch it is updated in .../kernel/timer.c AND in
.../arch/kernel/time.c. In the high-res-timers patch I made
the jiffies update an inline in an "arch" header file so I
could have the best of both worlds, i.e. update from common
code using arch resources (TSC, etc).

-g
>
> diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
> --- a/arch/i386/kernel/time.c Thu Jan 30 16:03:19 2003
> +++ b/arch/i386/kernel/time.c Thu Jan 30 16:03:19 2003
> @@ -657,6 +657,7 @@
> if(use_cyclone)
> mark_timeoffset_cyclone();
> else if (use_tsc) {
> + unsigned long delta = last_tsc_low;
> /*
> * It is important that these two operations happen almost at
> * the same time. We do the RDTSC stuff first, since it's
> @@ -700,6 +701,13 @@
> momentarily as they flip back to zero */
> if (count == LATCH) {
> count--;
> + }
> +
> + /* lost tick compensation */
> + delta = last_tsc_low - delta;
> + if(delta >= 2*loops_per_jiffy){
> + delta = (delta/loops_per_jiffy)-1;
> + jiffies += delta;
> }
>
> count = ((LATCH-1) - count) * TICK_SIZE;
>

-- 
George Anzinger   george@mvista.com
High-res-timers: 
http://sourceforge.net/projects/high-res-timers/
Preemption patch:
http://www.kernel.org/pub/linux/kernel/people/rml
-
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/



This archive was generated by hypermail 2b29 : Fri Jan 31 2003 - 22:00:24 EST