The MCE code is using the workqueue infrastructure waaaaaaay earlier than it
is allowed to.  It looks like the timer went off before the workqueue
initialisation had been run.
This should fix it.
 arch/i386/kernel/cpu/mcheck/k7.c        |    4 ----
 arch/i386/kernel/cpu/mcheck/mce.h       |    2 --
 arch/i386/kernel/cpu/mcheck/non-fatal.c |    5 ++++-
 arch/i386/kernel/cpu/mcheck/p4.c        |    3 ---
 4 files changed, 4 insertions(+), 10 deletions(-)
diff -puN arch/i386/kernel/cpu/mcheck/k7.c~mce-workqueue-startup-fix arch/i386/kernel/cpu/mcheck/k7.c
--- 25/arch/i386/kernel/cpu/mcheck/k7.c~mce-workqueue-startup-fix	2003-04-13 16:41:36.000000000 -0700
+++ 25-akpm/arch/i386/kernel/cpu/mcheck/k7.c	2003-04-13 16:42:24.000000000 -0700
@@ -92,8 +92,4 @@ void __init amd_mcheck_init(struct cpuin
 	set_in_cr4 (X86_CR4_MCE);
 	printk (KERN_INFO "Intel machine check reporting enabled on CPU#%d.\n",
 		smp_processor_id());
-
-#ifdef CONFIG_X86_MCE_NONFATAL
-	init_nonfatal_mce_checker();
-#endif
 }
diff -puN arch/i386/kernel/cpu/mcheck/mce.h~mce-workqueue-startup-fix arch/i386/kernel/cpu/mcheck/mce.h
--- 25/arch/i386/kernel/cpu/mcheck/mce.h~mce-workqueue-startup-fix	2003-04-13 16:41:43.000000000 -0700
+++ 25-akpm/arch/i386/kernel/cpu/mcheck/mce.h	2003-04-13 16:42:27.000000000 -0700
@@ -6,8 +6,6 @@ void intel_p5_mcheck_init(struct cpuinfo
 void intel_p6_mcheck_init(struct cpuinfo_x86 *c);
 void winchip_mcheck_init(struct cpuinfo_x86 *c);
 
-void init_nonfatal_mce_checker(void);
-
 /* Call the installed machine check handler for this CPU setup. */
 extern void (*machine_check_vector)(struct pt_regs *, long error_code);
 
diff -puN arch/i386/kernel/cpu/mcheck/non-fatal.c~mce-workqueue-startup-fix arch/i386/kernel/cpu/mcheck/non-fatal.c
--- 25/arch/i386/kernel/cpu/mcheck/non-fatal.c~mce-workqueue-startup-fix	2003-04-13 16:41:50.000000000 -0700
+++ 25-akpm/arch/i386/kernel/cpu/mcheck/non-fatal.c	2003-04-13 16:45:01.000000000 -0700
@@ -11,6 +11,7 @@
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 #include <linux/smp.h>
+#include <linux/module.h>
 
 #include <asm/processor.h> 
 #include <asm/system.h>
@@ -65,7 +66,7 @@ static void mce_timerfunc (unsigned long
 	add_timer (&mce_timer);
 }	
 
-void init_nonfatal_mce_checker()
+static int init_nonfatal_mce_checker()
 {
 	if (timerset == 0) {
 		/* Set the timer to check for non-fatal
@@ -78,4 +79,6 @@ void init_nonfatal_mce_checker()
 		timerset = 1;
 		printk(KERN_INFO "Machine check exception polling timer started.\n");
 	}
+	return 0;
 }
+module_init(init_nonfatal_mce_checker);
diff -puN arch/i386/kernel/cpu/mcheck/p4.c~mce-workqueue-startup-fix arch/i386/kernel/cpu/mcheck/p4.c
--- 25/arch/i386/kernel/cpu/mcheck/p4.c~mce-workqueue-startup-fix	2003-04-13 16:42:03.000000000 -0700
+++ 25-akpm/arch/i386/kernel/cpu/mcheck/p4.c	2003-04-13 16:44:22.000000000 -0700
@@ -255,7 +255,4 @@ void __init intel_p4_mcheck_init(struct 
 		intel_init_thermal(c);
 #endif
 	}
-#ifdef CONFIG_X86_MCE_NONFATAL
-	init_nonfatal_mce_checker();
-#endif
 }
_
-
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/