Re: 2.6.21-rc[123] regression with NOAPIC

From: Thomas Gleixner
Date: Thu Mar 22 2007 - 11:09:47 EST


On Thu, 2007-03-22 at 15:16 +0100, Adrian Bunk wrote:
> > > Does it work if you do _not_ revert the commits, and instead replace in
> > > drivers/acpi/processor_idle.c the
> > > #ifdef ARCH_APICTIMER_STOPS_ON_C3
> > > with an
> > > #if 0
> > > ?
> >
> > Then NOAPIC probably works again, but booting w/o NOAPIC fails.
>
> But we'll know that it's this code that has a problen with noapic
> in the CONFIG_GENERIC_CLOCKEVENTS=n case.

Nope. This code does not have a problem. It causes a problem elsewhere:

It calls switch_ipi_to_APIC_timer() or switch_APIC_timer_to_ipi(), which
sets/clears a bit in the broadcast mask and enables / disables the local
APIC timer.

I don't see right now, why this causes the box to lock up hard, but
maybe the debug printk's below give us some hint.

tglx

diff --git a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c
index 723417d..29376e2 100644
--- a/arch/x86_64/kernel/apic.c
+++ b/arch/x86_64/kernel/apic.c
@@ -886,6 +886,8 @@ void disable_APIC_timer(void)
if (using_apic_timer) {
unsigned long v;

+ printk("Disabling local APIC timer %d\n", apic_runs_main_timer);
+
v = apic_read(APIC_LVTT);
/*
* When an illegal vector value (0-15) is written to an LVT
@@ -910,6 +912,7 @@ void enable_APIC_timer(void)
!cpu_isset(cpu, timer_interrupt_broadcast_ipi_mask)) {
unsigned long v;

+ printk("Enabling local APIC timer: %d\n", apic_runs_main_timer);
v = apic_read(APIC_LVTT);
apic_write(APIC_LVTT, v & ~APIC_LVT_MASKED);
}
@@ -934,6 +937,7 @@ void smp_send_timer_broadcast_ipi(void)

cpus_and(mask, cpu_online_map, timer_interrupt_broadcast_ipi_mask);
if (!cpus_empty(mask)) {
+ printk("Send IPI\n");
send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
}
}


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/