Network error persists in 2.4.4
Quoted 1 line
(on problems with ne2k-pci on SMP-systems)
Seems you're experiencing the effects of the infamous IO-APIC problem ('erratum' in Intel-lingo). There's a patch for these problems by Maciej W. Rozycki, which should (IMnsHO) really be accepted into the main kernel tree since many people are experiencing these problems and the patch fixes them quite well.
The patch has been submitted to the list several times now, but I'll do it again. (attached to this message...)
Cheers//Frank
Signature · 9 lines
WWWWW _______________________
## o o\ / Frank de Lange \
}# \| / \
##---# _/ <Hacker for Hire> \
#### \ +31-320-252965 /
\ [email protected] /
-------------------------
[ "Omnis enim res, quae dando non deficit, dum habetur
et non datur, nondum habetur, quomodo habenda est." ]arch/i386/kernel/apic.c +9 -2
@@ -23,6 +23,7 @@#include <linux/mc146818rtc.h> #include <linux/kernel_stat.h> +#include <asm/atomic.h> #include <asm/smp.h> #include <asm/mtrr.h> #include <asm/mpspec.h>
@@ -270,7 +271,13 @@ void __init setup_local_APIC (void)* PCI Ne2000 networking cards and PII/PIII processors, dual * BX chipset. ] */ -#if 0 +/* +* Actually disabling the focus CPU check just makes the hang less +* frequent as it makes the interrupt distributon model be more +* like LRU than MRU (the short-term load is more even across CPUs). +* See also the comment in end_level_ioapic_irq(). --macro +*/ +#if 1 /* Enable focus processor (bit==0) */ value &= ~(1 <<9 );#else
@@ -764,7 +771,7 @@ asmlinkage void smp_error_interrupt(voidapic_write (APIC_ESR ,0 ); v1 =apic_read (APIC_ESR );ack_APIC_irq (); - irq_err_count++; +atomic_inc (&irq_err_count);/* Here is what the APIC error bits mean: 0: Send CS error
arch/i386/kernel/i8259.c +2 -1
@@ -12,6 +12,7 @@#include <linux/init.h> #include <linux/kernel_stat.h> +#include <asm/atomic.h> #include <asm/system.h> #include <asm/io.h> #include <asm/irq.h>
@@ -321,7 +322,7 @@ spurious_8259A_irq:printk ("spurious 8259A interrupt: IRQ%d.\n" , irq); spurious_irq_mask |= irqmask; } - irq_err_count++; +atomic_inc (&irq_err_count);/* * Theoretically we do not have to handle this IRQ, * but in Linux this does not cause problems and is
arch/i386/kernel/io_apic.c +63 -4
95 lines not on this page · raw message
arch/i386/kernel/irq.c +13 -2
@@ -33,6 +33,7 @@#include <linux/irq.h> #include <linux/proc_fs.h> +#include <asm/atomic.h> #include <asm/io.h> #include <asm/smp.h> #include <asm/system.h>
@@ -119,7 +120,12 @@ struct hw_interrupt_type no_irq_type = { end_none }; -volatile unsigned long irq_err_count; +atomic_t irq_err_count; +#ifdef CONFIG_X86_IO_APIC +#ifdef APIC_MISMATCH_DEBUG +atomic_t irq_mis_count; +#endif +#endif /* * Generic, controller-independent functions:
@@ -167,7 +173,12 @@ int get_irq_list(char *buf) apic_timer_irqs[cpu_logical_map(j)]); p +=sprintf (p,"\n" );#endif - p +=sprintf (p,"ERR: %10lu\n" , irq_err_count); + p +=sprintf (p,"ERR: %10u\n" ,atomic_read (&irq_err_count)); +#ifdef CONFIG_X86_IO_APIC +#ifdef APIC_MISMATCH_DEBUG + p +=sprintf (p,"MIS: %10u\n" ,atomic_read (&irq_mis_count)); +#endif +#endif return p - buf; }
include/asm-i386/hw_irq.h +4 -1
@@ -13,6 +13,7 @@*/ #include <linux/config.h> +#include <asm/atomic.h> #include <asm/irq.h> /*
@@ -83,7 +84,9 @@ extern int IO_APIC_get_PCI_irq_vector(inextern void send_IPI (int dest,int vector);extern unsigned long io_apic_irqs; -extern volatile unsigned long irq_err_count; + +extern atomic_t irq_err_count; +extern atomic_t irq_mis_count;extern char _stext, _etext;
include/asm-i386/io_apic.h +2 -0
@@ -12,6 +12,8 @@#ifdef CONFIG_X86_IO_APIC +#define APIC_MISMATCH_DEBUG +#define IO_APIC_BASE (idx) \ ((volatile int *)__fix_to_virt(FIX_IO_APIC_BASE_0 + idx))
include/linux/irq.h +0 -3
@@ -62,7 +62,4 @@ extern int setup_irq(unsigned int , struextern hw_irq_controller no_irq_type;/* needed in every arch ? */ extern void no_action (int cpl,void *dev_id,struct pt_regs *regs); -extern volatile unsigned long irq_err_count; -#endif /* __asm_h */ -