Merge branch 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / arch / x86 / kernel / cpu / mcheck / mce.c
index ad8d897..7b5063a 100644 (file)
@@ -913,9 +913,6 @@ void do_machine_check(struct pt_regs *regs, long error_code)
 
        percpu_inc(mce_exception_count);
 
-       if (notify_die(DIE_NMI, "machine check", regs, error_code,
-                          18, SIGKILL) == NOTIFY_STOP)
-               goto out;
        if (!banks)
                goto out;
 
@@ -1145,6 +1142,15 @@ static void mce_start_timer(unsigned long data)
        add_timer_on(t, smp_processor_id());
 }
 
+/* Must not be called in IRQ context where del_timer_sync() can deadlock */
+static void mce_timer_delete_all(void)
+{
+       int cpu;
+
+       for_each_online_cpu(cpu)
+               del_timer_sync(&per_cpu(mce_timer, cpu));
+}
+
 static void mce_do_trigger(struct work_struct *work)
 {
        call_usermodehelper(mce_helper, mce_helper_argv, NULL, UMH_NO_WAIT);
@@ -1755,7 +1761,6 @@ static struct syscore_ops mce_syscore_ops = {
 
 static void mce_cpu_restart(void *data)
 {
-       del_timer_sync(&__get_cpu_var(mce_timer));
        if (!mce_available(__this_cpu_ptr(&cpu_info)))
                return;
        __mcheck_cpu_init_generic();
@@ -1765,16 +1770,15 @@ static void mce_cpu_restart(void *data)
 /* Reinit MCEs after user configuration changes */
 static void mce_restart(void)
 {
+       mce_timer_delete_all();
        on_each_cpu(mce_cpu_restart, NULL, 1);
 }
 
 /* Toggle features for corrected errors */
-static void mce_disable_ce(void *all)
+static void mce_disable_cmci(void *data)
 {
        if (!mce_available(__this_cpu_ptr(&cpu_info)))
                return;
-       if (all)
-               del_timer_sync(&__get_cpu_var(mce_timer));
        cmci_clear();
 }
 
@@ -1857,7 +1861,8 @@ static ssize_t set_ignore_ce(struct sys_device *s,
        if (mce_ignore_ce ^ !!new) {
                if (new) {
                        /* disable ce features */
-                       on_each_cpu(mce_disable_ce, (void *)1, 1);
+                       mce_timer_delete_all();
+                       on_each_cpu(mce_disable_cmci, NULL, 1);
                        mce_ignore_ce = 1;
                } else {
                        /* enable ce features */
@@ -1880,7 +1885,7 @@ static ssize_t set_cmci_disabled(struct sys_device *s,
        if (mce_cmci_disabled ^ !!new) {
                if (new) {
                        /* disable cmci */
-                       on_each_cpu(mce_disable_ce, NULL, 1);
+                       on_each_cpu(mce_disable_cmci, NULL, 1);
                        mce_cmci_disabled = 1;
                } else {
                        /* enable cmci */