diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids x-ref/arch/i386/kernel/irq.c x/arch/i386/kernel/irq.c
--- x-ref/arch/i386/kernel/irq.c	2003-10-02 00:09:41.000000000 +0200
+++ x/arch/i386/kernel/irq.c	2003-10-02 11:15:56.000000000 +0200
@@ -308,6 +308,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 --exclude {arch} --exclude .arch-ids x-ref/arch/ia64/kernel/irq.c x/arch/ia64/kernel/irq.c
--- x-ref/arch/ia64/kernel/irq.c	2003-08-26 00:12:44.000000000 +0200
+++ x/arch/ia64/kernel/irq.c	2003-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids x-ref/arch/mips/kernel/irq.c x/arch/mips/kernel/irq.c
--- x-ref/arch/mips/kernel/irq.c	2003-08-26 00:12:45.000000000 +0200
+++ x/arch/mips/kernel/irq.c	2003-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids x-ref/arch/mips64/kernel/irq.c x/arch/mips64/kernel/irq.c
--- x-ref/arch/mips64/kernel/irq.c	2003-08-26 00:12:46.000000000 +0200
+++ x/arch/mips64/kernel/irq.c	2003-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids x-ref/arch/ppc/kernel/irq.c x/arch/ppc/kernel/irq.c
--- x-ref/arch/ppc/kernel/irq.c	2003-10-02 00:09:42.000000000 +0200
+++ x/arch/ppc/kernel/irq.c	2003-10-02 11:15:56.000000000 +0200
@@ -688,6 +688,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 --exclude {arch} --exclude .arch-ids x-ref/arch/ppc64/kernel/irq.c x/arch/ppc64/kernel/irq.c
--- x-ref/arch/ppc64/kernel/irq.c	2003-03-15 03:24:58.000000000 +0100
+++ x/arch/ppc64/kernel/irq.c	2003-10-02 11:15:56.000000000 +0200
@@ -666,6 +666,7 @@ static void show(char * str)
 
 void synchronize_irq(void)
 {
+	smp_mb();
 	if (irqs_running()) {
 		cli();
 		sti();
diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids x-ref/arch/sparc64/kernel/irq.c x/arch/sparc64/kernel/irq.c
--- x-ref/arch/sparc64/kernel/irq.c	2003-10-02 00:09:42.000000000 +0200
+++ x/arch/sparc64/kernel/irq.c	2003-10-02 11:15:56.000000000 +0200
@@ -604,6 +604,7 @@ static void show(char * str)
 
 void synchronize_irq(void)
 {
+	smp_mb();
 	if (irqs_running()) {
 		cli();
 		sti();
diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/x86_64/kernel/irq.c x/arch/x86_64/kernel/irq.c
--- x-ref/arch/x86_64/kernel/irq.c	2003-10-02 00:09:42.000000000 +0200
+++ x/arch/x86_64/kernel/irq.c	2003-10-02 11:15:56.000000000 +0200
@@ -333,6 +333,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 --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids 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-10-02 11:15:56.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 --exclude {arch} --exclude .arch-ids x-ref/include/asm-ppc/hardirq.h x/include/asm-ppc/hardirq.h
--- x-ref/include/asm-ppc/hardirq.h	2003-08-26 00:13:07.000000000 +0200
+++ x/include/asm-ppc/hardirq.h	2003-10-02 11:15:56.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);