2003-01-08 23:17:38

by john stultz

[permalink] [raw]
Subject: [PATCH] linux-2.4.21-pre3_lost-tick_A0

Marcelo,

Occasionally due to SMIs issued by the service processor, x440s will
lose an interrupt or two. This can cause gettimeofday time
discontinuities as well as clock skew (due to jiffies not being
incremented when needed). This patch uses the cyclone timer to notice
these lost ticks and compensate for them. It only affects systems using
the cyclone timer (x440s only at the moment).

Please apply.

thanks
-john

diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
--- a/arch/i386/kernel/time.c Wed Jan 8 11:37:13 2003
+++ b/arch/i386/kernel/time.c Wed Jan 8 11:37:13 2003
@@ -279,6 +279,7 @@
static inline void mark_timeoffset_cyclone(void)
{
int count;
+ unsigned long delta = last_cyclone_timer;
spin_lock(&i8253_lock);
/* quickly read the cyclone timer */
if(cyclone_timer)
@@ -291,6 +292,13 @@
count |= inb(0x40) << 8;
spin_unlock(&i8253_lock);

+ /*lost tick compensation*/
+ delta = last_cyclone_timer - delta;
+ if(delta > loops_per_jiffy+2000){
+ delta = (delta/loops_per_jiffy)-1;
+ jiffies += delta;
+ }
+
count = ((LATCH-1) - count) * TICK_SIZE;
delay_at_last_interrupt = (count + LATCH/2) / LATCH;
}