public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH] linux-2.5.59_lost-tick_A0
@ 2003-01-21 22:59 john stultz
  2003-01-21 23:32 ` Andrew Morton
  2003-01-24 23:13 ` Stephen Hemminger
  0 siblings, 2 replies; 10+ messages in thread
From: john stultz @ 2003-01-21 22:59 UTC (permalink / raw)
  To: lkml

All,
	This patch addresses the following problem: Linux cannot properly
handle the case where interrupts are disabled for longer then two ticks.

Quick background: 
	gettimeofday() calculates wall time using roughly the following
equation: xtime + (jiffies - wall_jiffies) + timer->get_offset()

When a tick is lost, the system is able to compensate short-term because
even though jiffies is not incremented, timer->get_offset() (which is
hardware based) continues to increase. However this falls apart, because
if after 3 or so lost-ticks an interrupt does occur, jiffies is
incremented only once and we reset timer->get_offset() effectively
loosing the time we had been compensating for. This causes brief
inconsistencies in time, in addition to causing system time to drift
behind that of other systems.

This patch solves the problem by checking when an interrupt occurs if
timer->get_offset() is a value greater then 2 ticks. If so, it
increments jiffies appropriately. 

Comments, flames and suggestions are requested and welcome.

thanks
-john

diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
--- a/arch/i386/kernel/time.c	Tue Jan 21 14:14:18 2003
+++ b/arch/i386/kernel/time.c	Tue Jan 21 14:14:18 2003
@@ -265,6 +265,21 @@
 #endif
 }
 
+/*Lost tick detection and compensation*/
+void detect_lost_tick(void)
+{
+	/*read time since last interrupt*/
+	unsigned long delta = timer->get_offset();
+
+	/*check if delta is greater then two ticks*/
+	if(delta > 2*(1000000/HZ)){
+		/*calculate number of missed ticks*/
+		delta = delta/(1000000/HZ)-1;
+		jiffies += delta;
+	}
+		
+}
+
 /*
  * This is the same as the above, except we _also_ save the current
  * Time Stamp Counter value at the time of the timer interrupt, so that
@@ -281,6 +296,7 @@
 	 */
 	write_lock(&xtime_lock);
 
+	detect_lost_tick();
 	timer->mark_offset();
  
 	do_timer_interrupt(irq, NULL, regs);




^ permalink raw reply	[flat|nested] 10+ messages in thread
[parent not found: <1043189962.15683.82.camel@w-jstultz2.beaverton.ibm.com.suse.lists.linux.kernel>]

end of thread, other threads:[~2003-01-24 23:05 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-21 22:59 [RFC][PATCH] linux-2.5.59_lost-tick_A0 john stultz
2003-01-21 23:32 ` Andrew Morton
2003-01-21 23:48   ` john stultz
2003-01-22  5:00   ` Valdis.Kletnieks
2003-01-24 23:13 ` Stephen Hemminger
2003-01-24 23:06   ` john stultz
     [not found] <1043189962.15683.82.camel@w-jstultz2.beaverton.ibm.com.suse.lists.linux.kernel>
2003-01-21 23:27 ` Andi Kleen
2003-01-21 23:31   ` john stultz
2003-01-21 23:48     ` Andi Kleen
2003-01-21 23:49       ` john stultz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox