[BUG] [PATCH] Infinite loop in arch/i386/kernel/io_apic.c

From: Sam Varshavchik (mrsam@courier-mta.com)
Date: Tue Oct 09 2001 - 21:04:26 EST


Good morning/afternoon/evening/night,

I see that there was some debug code added to io_apic.c in kernel 2.4.6,
that's compiled by default.

It looks to me like there's a typo in the APIC_LOCKUP_DEBUG code that
results in certain hardware setups potentially triggering an infinite loop,
while holding the ioapic spinlock: namely when the irq_2_pin list contains
more than one list member: the loop pointer gets reinitialized each time at
the top of the loop - kablooey.

After upgrading from 2.4.3 to 2.4.7, my 440GX motherboard (with a couple of
PCI devices) keels over fast enough that even the NMI watchdog doesn't help,
and the following patch fixes it.

-- 
Sam 

*** linux/arch/i386/kernel/io_apic.c.orig Tue Oct 9 21:11:10 2001 --- linux/arch/i386/kernel/io_apic.c Tue Oct 9 21:13:03 2001 *************** *** 1248,1261 **** ack_APIC_irq(); if (!(v & (1 << (i & 0x1f)))) { #ifdef APIC_MISMATCH_DEBUG atomic_inc(&irq_mis_count); #endif spin_lock(&ioapic_lock); __mask_and_edge_IO_APIC_irq(irq); #ifdef APIC_LOCKUP_DEBUG ! for (;;) { ! struct irq_pin_list *entry = irq_2_pin + irq; unsigned int reg; if (entry->pin == -1) --- 1248,1264 ---- ack_APIC_irq(); if (!(v & (1 << (i & 0x1f)))) { + #ifdef APIC_LOCKUP_DEBUG + struct irq_pin_list *entry; + #endif + #ifdef APIC_MISMATCH_DEBUG atomic_inc(&irq_mis_count); #endif spin_lock(&ioapic_lock); __mask_and_edge_IO_APIC_irq(irq); #ifdef APIC_LOCKUP_DEBUG ! for (entry = irq_2_pin + irq;;) { unsigned int reg; if (entry->pin == -1)

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



This archive was generated by hypermail 2b29 : Mon Oct 15 2001 - 21:00:29 EST