mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] disable lost tick compensation before TSCs are synced
@ 2006-01-30 22:29 john stultz
  2006-01-31 23:42 ` Andrew Morton
  0 siblings, 1 reply; 2+ messages in thread
From: john stultz @ 2006-01-30 22:29 UTC (permalink / raw)
  To: Andrew Morton; +Cc: lkml, Andy Whitcroft

Avoid lost tick compensation early in boot before the TSCs are
synchronized. Currently timekeeping is enabled before the TSCs are
synchronized, thus when the TSCs are synched (reset to zero), it appears
that a number of lost ticks have occurred. This can cause premature
expiry of timers and in extreme cases can cause the soft lockup
detection to fire.

This resolves issues reported by Andy Whitcroft as well as bug #5366
reported by Tim Mann.

The new timekeeping work avoids this issue, but since it is not quite
ready for mainline, this patch would be a good idea for 2.6.16.

thanks
-john


Signed-off-by: John Stultz <johnstul@us.ibm.com>
Acked-by: Andy Whitcroft <apw@shadowen.org>

diff --git a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c
--- a/arch/i386/kernel/timers/timer_tsc.c
+++ b/arch/i386/kernel/timers/timer_tsc.c
@@ -45,6 +45,15 @@ static unsigned long last_tsc_high; /* m
 static unsigned long long monotonic_base;
 static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED;
 
+/* Avoid compensating for lost ticks before TSCs are synched */
+static int detect_lost_ticks;
+static int __init start_lost_tick_compensation(void)
+{
+	detect_lost_ticks = 1;
+	return 0;
+}
+late_initcall(start_lost_tick_compensation);
+
 /* convert from cycles(64bits) => nanoseconds (64bits)
  *  basic equation:
  *		ns = cycles / (freq / ns_per_sec)
@@ -196,7 +205,8 @@ static void mark_offset_tsc_hpet(void)
 
 	/* lost tick compensation */
 	offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
-	if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
+	if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))
+					&& detect_lost_ticks) {
 		int lost_ticks = (offset - hpet_last) / hpet_tick;
 		jiffies_64 += lost_ticks;
 	}
@@ -419,7 +429,7 @@ static void mark_offset_tsc(void)
 	delta += delay_at_last_interrupt;
 	lost = delta/(1000000/HZ);
 	delay = delta%(1000000/HZ);
-	if (lost >= 2) {
+	if (lost >= 2 && detect_lost_ticks) {
 		jiffies_64 += lost-1;
 
 		/* sanity check to ensure we're not always losing ticks */



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] disable lost tick compensation before TSCs are synced
  2006-01-30 22:29 [PATCH] disable lost tick compensation before TSCs are synced john stultz
@ 2006-01-31 23:42 ` Andrew Morton
  0 siblings, 0 replies; 2+ messages in thread
From: Andrew Morton @ 2006-01-31 23:42 UTC (permalink / raw)
  To: john stultz; +Cc: linux-kernel, apw

john stultz <johnstul@us.ibm.com> wrote:
>
> The new timekeeping work avoids this issue, but since it is not quite
> ready for mainline, this patch would be a good idea for 2.6.16.

Oh.  That simplifies things.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-01-31 23:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-01-30 22:29 [PATCH] disable lost tick compensation before TSCs are synced john stultz
2006-01-31 23:42 ` Andrew Morton

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

all inboxes | Powered by JetHome®