The MCE code is setting up a timer whose handler uses the workqueue code
before workqueue is initialised. If you boot slowly it oopses.
Convert the MCE code to use an initcall.
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
}
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);
#include <linux/workqueue.h>
#include <linux/interrupt.h>
#include <linux/smp.h>
+#include <linux/module.h>
#include <asm/processor.h>
#include <asm/system.h>
add_timer (&mce_timer);
}
-void init_nonfatal_mce_checker()
+static int __init init_nonfatal_mce_checker(void)
{
if (timerset == 0) {
/* Set the timer to check for non-fatal
timerset = 1;
printk(KERN_INFO "Machine check exception polling timer started.\n");
}
+ return 0;
}
+module_init(init_nonfatal_mce_checker);
intel_init_thermal(c);
#endif
}
-#ifdef CONFIG_X86_MCE_NONFATAL
- init_nonfatal_mce_checker();
-#endif
}