Merge branch 'linux_next' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[pandora-kernel.git] / arch / x86 / kernel / cpu / mcheck / mce.c
index 63aad27..864830e 100644 (file)
@@ -213,8 +213,13 @@ static void print_mce(struct mce *m)
                pr_cont("MISC %llx ", m->misc);
 
        pr_cont("\n");
-       pr_emerg(HW_ERR "PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x\n",
-               m->cpuvendor, m->cpuid, m->time, m->socketid, m->apicid);
+       /*
+        * Note this output is parsed by external tools and old fields
+        * should not be changed.
+        */
+       pr_emerg(HW_ERR "PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x microcode %x\n",
+               m->cpuvendor, m->cpuid, m->time, m->socketid, m->apicid,
+               cpu_data(m->extcpu).microcode);
 
        /*
         * Print out human-readable details about the MCE error,
@@ -902,9 +907,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;
 
@@ -1134,6 +1136,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);
@@ -1744,7 +1755,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();
@@ -1754,16 +1764,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();
 }
 
@@ -1846,7 +1855,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 */
@@ -1869,7 +1879,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 */