Messages in this thread | | | Date | Thu, 30 Jan 2003 17:08:21 -0800 | From | george anzinger <> | Subject | Re: [RFC][PATCH] linux-2.4.21-pre4_tsc-lost-tick_A0 |
| |
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/
| |