diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/alpha/kernel/irq_smp.c x/arch/alpha/kernel/irq_smp.c --- x-ref/arch/alpha/kernel/irq_smp.c 2003-03-15 03:24:53.000000000 +0100 +++ x/arch/alpha/kernel/irq_smp.c 2003-08-29 03:34:11.000000000 +0200 @@ -242,6 +242,7 @@ synchronize_irq(void) } while (global_count != local_count); #else /* Jay's version. */ + smp_mb(); if (irqs_running()) { cli(); sti(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/i386/kernel/irq.c x/arch/i386/kernel/irq.c --- x-ref/arch/i386/kernel/irq.c 2003-08-29 03:33:45.000000000 +0200 +++ x/arch/i386/kernel/irq.c 2003-08-29 03:34:07.000000000 +0200 @@ -311,6 +311,7 @@ static inline void wait_on_irq(int cpu) */ void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { /* Stupid approach */ cli(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/ia64/kernel/irq.c x/arch/ia64/kernel/irq.c --- x-ref/arch/ia64/kernel/irq.c 2003-08-29 03:33:44.000000000 +0200 +++ x/arch/ia64/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -344,6 +344,7 @@ static inline void wait_on_irq(void) */ void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { /* Stupid approach */ cli(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/mips/kernel/irq.c x/arch/mips/kernel/irq.c --- x-ref/arch/mips/kernel/irq.c 2003-08-29 03:33:43.000000000 +0200 +++ x/arch/mips/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -172,6 +172,7 @@ static inline void wait_on_irq(int cpu) */ void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { /* Stupid approach */ cli(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/mips64/kernel/irq.c x/arch/mips64/kernel/irq.c --- x-ref/arch/mips64/kernel/irq.c 2003-03-15 03:24:56.000000000 +0100 +++ x/arch/mips64/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -171,6 +171,7 @@ static inline void wait_on_irq(int cpu) */ void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { /* Stupid approach */ cli(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/parisc/kernel/irq_smp.c x/arch/parisc/kernel/irq_smp.c --- x-ref/arch/parisc/kernel/irq_smp.c 2003-03-15 03:24:56.000000000 +0100 +++ x/arch/parisc/kernel/irq_smp.c 2003-08-29 03:34:11.000000000 +0200 @@ -225,6 +225,7 @@ void synchronize_irq(void) { /* Jay's version. */ + smp_mb(); if (irqs_running()) { cli(); sti(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/ppc/kernel/irq.c x/arch/ppc/kernel/irq.c --- x-ref/arch/ppc/kernel/irq.c 2003-08-29 03:33:43.000000000 +0200 +++ x/arch/ppc/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -681,6 +681,7 @@ void synchronize_bh(void) */ void synchronize_irq(void) { + smp_mb(); if (atomic_read(&global_irq_count)) { /* Stupid approach */ cli(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/ppc64/kernel/irq.c x/arch/ppc64/kernel/irq.c --- x-ref/arch/ppc64/kernel/irq.c 2003-08-29 03:33:43.000000000 +0200 +++ x/arch/ppc64/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -672,6 +672,7 @@ static void show(char * str) void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { cli(); sti(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/sparc/kernel/irq.c x/arch/sparc/kernel/irq.c --- x-ref/arch/sparc/kernel/irq.c 2003-06-13 22:07:24.000000000 +0200 +++ x/arch/sparc/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -243,6 +243,7 @@ static void show(char * str) */ void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { cli(); sti(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/sparc64/kernel/irq.c x/arch/sparc64/kernel/irq.c --- x-ref/arch/sparc64/kernel/irq.c 2003-06-13 22:07:24.000000000 +0200 +++ x/arch/sparc64/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -592,6 +592,7 @@ static void show(char * str) void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { cli(); sti(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/x86_64/kernel/irq.c x/arch/x86_64/kernel/irq.c --- x-ref/arch/x86_64/kernel/irq.c 2003-08-29 03:33:43.000000000 +0200 +++ x/arch/x86_64/kernel/irq.c 2003-08-29 03:34:11.000000000 +0200 @@ -335,6 +335,7 @@ static inline void wait_on_irq(int cpu) */ void synchronize_irq(void) { + smp_mb(); if (irqs_running()) { /* Stupid approach */ cli(); diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-alpha/hardirq.h x/include/asm-alpha/hardirq.h --- x-ref/include/asm-alpha/hardirq.h 2003-03-15 03:25:09.000000000 +0100 +++ x/include/asm-alpha/hardirq.h 2003-08-29 03:34:11.000000000 +0200 @@ -75,6 +75,8 @@ static inline void irq_enter(int cpu, in { ++local_irq_count(cpu); + smp_mb(); + while (spin_is_locked(&global_irq_lock)) barrier(); } diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-i386/hardirq.h x/include/asm-i386/hardirq.h --- x-ref/include/asm-i386/hardirq.h 2003-08-29 03:33:12.000000000 +0200 +++ x/include/asm-i386/hardirq.h 2003-08-29 03:34:07.000000000 +0200 @@ -71,6 +71,8 @@ static inline void irq_enter(int cpu, in { ++local_irq_count(cpu); + smp_mb(); + while (test_bit(0,&global_irq_lock)) { cpu_relax(); } diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-ia64/hardirq.h x/include/asm-ia64/hardirq.h --- x-ref/include/asm-ia64/hardirq.h 2003-03-15 03:25:11.000000000 +0100 +++ x/include/asm-ia64/hardirq.h 2003-08-29 03:34:11.000000000 +0200 @@ -80,6 +80,8 @@ local_irq_enter (int irq) { really_local_irq_count()++; + smp_mb(); + while (test_bit(0,&global_irq_lock)) { /* nothing */; } diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-mips/hardirq.h x/include/asm-mips/hardirq.h --- x-ref/include/asm-mips/hardirq.h 2003-03-15 03:25:11.000000000 +0100 +++ x/include/asm-mips/hardirq.h 2003-08-29 03:34:11.000000000 +0200 @@ -82,6 +82,8 @@ static inline void irq_enter(int cpu, in { ++local_irq_count(cpu); + smp_mb(); + while (spin_is_locked(&global_irq_lock)) barrier(); } diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-mips64/hardirq.h x/include/asm-mips64/hardirq.h --- x-ref/include/asm-mips64/hardirq.h 2003-03-15 03:25:12.000000000 +0100 +++ x/include/asm-mips64/hardirq.h 2003-08-29 03:34:11.000000000 +0200 @@ -81,6 +81,8 @@ static inline void irq_enter(int cpu, in { ++local_irq_count(cpu); + smp_mb(); + while (spin_is_locked(&global_irq_lock)) barrier(); } diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-parisc/hardirq.h x/include/asm-parisc/hardirq.h --- x-ref/include/asm-parisc/hardirq.h 2003-03-15 03:25:12.000000000 +0100 +++ x/include/asm-parisc/hardirq.h 2003-08-29 03:34:11.000000000 +0200 @@ -82,6 +82,8 @@ static inline void irq_enter(int cpu, in { ++local_irq_count(cpu); + smp_mb(); + while (spin_is_locked(&global_irq_lock)) barrier(); } diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-ppc/hardirq.h x/include/asm-ppc/hardirq.h --- x-ref/include/asm-ppc/hardirq.h 2003-06-13 22:07:41.000000000 +0200 +++ x/include/asm-ppc/hardirq.h 2003-08-29 03:34:11.000000000 +0200 @@ -69,6 +69,7 @@ static inline void hardirq_enter(int cpu ++local_irq_count(cpu); atomic_inc(&global_irq_count); + smp_mb__after_atomic_inc(); while (test_bit(0,&global_irq_lock)) { if (cpu == global_irq_holder) { printk("uh oh, interrupt while we hold global irq lock! (CPU %d)\n", cpu); diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-x86_64/hardirq.h x/include/asm-x86_64/hardirq.h --- x-ref/include/asm-x86_64/hardirq.h 2003-03-15 03:25:16.000000000 +0100 +++ x/include/asm-x86_64/hardirq.h 2003-08-29 03:34:11.000000000 +0200 @@ -67,6 +67,8 @@ static inline void irq_enter(int cpu, in { ++local_irq_count(cpu); + smp_mb(); + while (test_bit(0,&global_irq_lock)) { cpu_relax(); }