Re: [PATCH] Dynamic tick, version 050127-1

From: Tony Lindgren
Date: Wed Feb 02 2005 - 22:09:48 EST


* Pavel Machek <pavel@xxxxxxx> [050202 06:13]:
>
> Hi!
>
> > > > > I used your config advices from second mail, still it does not work as
> > > > > expected: system gets "too sleepy". Like it takes a nap during boot
> > > > > after "dyn-tick: Maximum ticks to skip limited to 1339", and key is
> > > > > needed to make it continue boot. Then cursor stops blinking and
> > > > > machine is hung at random intervals during use, key is enough to awake
> > > > > it.
> > > >
> > > > Hmmm, that sounds like the local APIC does not wake up the PIT
> > > > interrupt properly after sleep. Hitting the keys causes the timer
> > > > interrupt to get called, and that explains why it keeps running. But
> > > > the timer ticks are not happening as they should for some reason.
> > > > This should not happen (tm)...
> > >
> > > :-). Any ideas how to debug it? Previous version of patch seemed to work better...
> >
> > I don't think it's HPET timer, or CONFIG_SMP. It also looks like your
> > local APIC timer is working.
>
> I turned off CONFIG_PREEMPT, but nothing changed :-(.

What about reprogramming the timers in time.c after the sleep? Do
you to dyn_tick->skip = 1; part in dyn_tick_timer_interrupt?

It could also be that the reprogamming of PIT timer does not work on
your machine. I chopped off the udelays there... Can you try
something like this:
--- a/arch/i386/kernel/time.c 2005-01-27 12:58:04 -08:00
+++ b/arch/i368/kernel/time.c 2005-02-02 19:01:31 -08:00
@@ -479,8 +480,11 @@

spin_lock_irqsave(&i8253_lock, flags);
outb_p(0x34, PIT_MODE); /* binary, mode 2, LSB/MSB, ch 0 */
+ udelay(10);
outb_p(skip & 0xff, PIT_CH0); /* LSB */
+ udelay(10);
outb(skip >> 8, PIT_CH0); /* MSB */
+ udelay(10);
spin_unlock_irqrestore(&i8253_lock, flags);
}