Ingo Molnar wrote:
> 
> 
> okay - i just wanted to hear a definitive word from you that this fixes
> your problem, because this is what we'll have to do as a final solution.
> (barring any other solution.)
> 
Ingo, is that possible?

The current fix is "disable_irq_nosync() and enable_irq() cause
deadlocks with level triggered ioapic irqs, do not use them" - I'm sure
ne2k-pci isn't the only driver that uses these function.

I have found one combination that doesn't hang with the unpatched
8390.c, but network throughput is down to 1/2. I hope that's due to the
debugging changes.

I'll restart now from a fresh 2.4.0 tree:
Changes:

1) enable focus cpu.
2) apply the attached patch.

I'm not sure if it's a real fix or if it just hides the problem: my
sysrq patch has shown that clearing and setting the "level trigger" bit
in the io apic reanimates the IO APIC.

--
        Manfred
--- build-2.4/arch/i386/kernel/io_apic.c.orig   Fri Jan 12 20:17:36 2001
+++ build-2.4/arch/i386/kernel/io_apic.c        Fri Jan 12 21:26:31 2001
@@ -134,6 +134,30 @@
        spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
+DO_ACTION( __trigger_level,    0, |= 0x00008000, io_apic_sync(entry->apic))/* mask = 
+1 */
+DO_ACTION( __trigger_edge,  0, &= 0xffff7fff, )                                /* 
+mask = 0 */
+
+
+static void unmask_level_IO_APIC_irq (unsigned int irq)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&ioapic_lock, flags);
+       __trigger_level_IO_APIC_irq(irq);
+       __unmask_IO_APIC_irq(irq);
+       spin_unlock_irqrestore(&ioapic_lock, flags);
+}
+
+static void mask_level_IO_APIC_irq (unsigned int irq)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&ioapic_lock, flags);
+       __mask_IO_APIC_irq(irq);
+       __trigger_edge_IO_APIC_irq(irq);
+       spin_unlock_irqrestore(&ioapic_lock, flags);
+}
+
 static void unmask_IO_APIC_irq (unsigned int irq)
 {
        unsigned long flags;
@@ -143,6 +167,7 @@
        spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
+
 void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
 {
        struct IO_APIC_route_entry entry;
@@ -1181,14 +1206,14 @@
  */
 static unsigned int startup_level_ioapic_irq (unsigned int irq)
 {
-       unmask_IO_APIC_irq(irq);
+       unmask_level_IO_APIC_irq(irq);
 
        return 0; /* don't check for pending */
 }
 
-#define shutdown_level_ioapic_irq      mask_IO_APIC_irq
-#define enable_level_ioapic_irq                unmask_IO_APIC_irq
-#define disable_level_ioapic_irq       mask_IO_APIC_irq
+#define shutdown_level_ioapic_irq      mask_level_IO_APIC_irq
+#define enable_level_ioapic_irq                unmask_level_IO_APIC_irq
+#define disable_level_ioapic_irq       mask_level_IO_APIC_irq
 
 static void end_level_ioapic_irq (unsigned int i)
 {

Reply via email to