include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / arch / x86 / kernel / cpu / mcheck / mce-inject.c
index ad5d927..e7dbde7 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/kdebug.h>
 #include <linux/cpu.h>
 #include <linux/sched.h>
+#include <linux/gfp.h>
 #include <asm/mce.h>
 #include <asm/apic.h>
 
@@ -44,7 +45,7 @@ static void inject_mce(struct mce *m)
        i->finished = 1;
 }
 
-static void raise_corrected(struct mce *m)
+static void raise_poll(struct mce *m)
 {
        unsigned long flags;
        mce_banks_t b;
@@ -56,7 +57,7 @@ static void raise_corrected(struct mce *m)
        m->finished = 0;
 }
 
-static void raise_uncorrected(struct mce *m, struct pt_regs *pregs)
+static void raise_exception(struct mce *m, struct pt_regs *pregs)
 {
        struct pt_regs regs;
        unsigned long flags;
@@ -74,7 +75,7 @@ static void raise_uncorrected(struct mce *m, struct pt_regs *pregs)
        m->finished = 0;
 }
 
-static cpumask_t mce_inject_cpumask;
+static cpumask_var_t mce_inject_cpumask;
 
 static int mce_raise_notify(struct notifier_block *self,
                            unsigned long val, void *data)
@@ -82,13 +83,13 @@ static int mce_raise_notify(struct notifier_block *self,
        struct die_args *args = (struct die_args *)data;
        int cpu = smp_processor_id();
        struct mce *m = &__get_cpu_var(injectm);
-       if (val != DIE_NMI_IPI || !cpu_isset(cpu, mce_inject_cpumask))
+       if (val != DIE_NMI_IPI || !cpumask_test_cpu(cpu, mce_inject_cpumask))
                return NOTIFY_DONE;
-       cpu_clear(cpu, mce_inject_cpumask);
-       if (m->status & MCI_STATUS_UC)
-               raise_uncorrected(m, args->regs);
+       cpumask_clear_cpu(cpu, mce_inject_cpumask);
+       if (m->inject_flags & MCJ_EXCEPTION)
+               raise_exception(m, args->regs);
        else if (m->status)
-               raise_corrected(m);
+               raise_poll(m);
        return NOTIFY_STOP;
 }
 
@@ -98,13 +99,14 @@ static struct notifier_block mce_raise_nb = {
 };
 
 /* Inject mce on current CPU */
-static int raise_local(struct mce *m)
+static int raise_local(void)
 {
+       struct mce *m = &__get_cpu_var(injectm);
        int context = MCJ_CTX(m->inject_flags);
        int ret = 0;
        int cpu = m->extcpu;
 
-       if (m->status & MCI_STATUS_UC) {
+       if (m->inject_flags & MCJ_EXCEPTION) {
                printk(KERN_INFO "Triggering MCE exception on CPU %d\n", cpu);
                switch (context) {
                case MCJ_CTX_IRQ:
@@ -115,7 +117,7 @@ static int raise_local(struct mce *m)
                         */
                        /*FALL THROUGH*/
                case MCJ_CTX_PROCESS:
-                       raise_uncorrected(m, NULL);
+                       raise_exception(m, NULL);
                        break;
                default:
                        printk(KERN_INFO "Invalid MCE context\n");
@@ -124,7 +126,7 @@ static int raise_local(struct mce *m)
                printk(KERN_INFO "MCE exception done on CPU %d\n", cpu);
        } else if (m->status) {
                printk(KERN_INFO "Starting machine check poll CPU %d\n", cpu);
-               raise_corrected(m);
+               raise_poll(m);
                mce_notify_irq();
                printk(KERN_INFO "Machine check poll done on CPU %d\n", cpu);
        } else
@@ -147,32 +149,32 @@ static void raise_mce(struct mce *m)
                unsigned long start;
                int cpu;
                get_online_cpus();
-               mce_inject_cpumask = cpu_online_map;
-               cpu_clear(get_cpu(), mce_inject_cpumask);
+               cpumask_copy(mce_inject_cpumask, cpu_online_mask);
+               cpumask_clear_cpu(get_cpu(), mce_inject_cpumask);
                for_each_online_cpu(cpu) {
                        struct mce *mcpu = &per_cpu(injectm, cpu);
                        if (!mcpu->finished ||
                            MCJ_CTX(mcpu->inject_flags) != MCJ_CTX_RANDOM)
-                               cpu_clear(cpu, mce_inject_cpumask);
+                               cpumask_clear_cpu(cpu, mce_inject_cpumask);
                }
-               if (!cpus_empty(mce_inject_cpumask))
-                       apic->send_IPI_mask(&mce_inject_cpumask, NMI_VECTOR);
+               if (!cpumask_empty(mce_inject_cpumask))
+                       apic->send_IPI_mask(mce_inject_cpumask, NMI_VECTOR);
                start = jiffies;
-               while (!cpus_empty(mce_inject_cpumask)) {
+               while (!cpumask_empty(mce_inject_cpumask)) {
                        if (!time_before(jiffies, start + 2*HZ)) {
                                printk(KERN_ERR
                                "Timeout waiting for mce inject NMI %lx\n",
-                                       *cpus_addr(mce_inject_cpumask));
+                                       *cpumask_bits(mce_inject_cpumask));
                                break;
                        }
                        cpu_relax();
                }
-               raise_local(m);
+               raise_local();
                put_cpu();
                put_online_cpus();
        } else
 #endif
-               raise_local(m);
+               raise_local();
 }
 
 /* Error injection interface */
@@ -209,6 +211,8 @@ static ssize_t mce_write(struct file *filp, const char __user *ubuf,
 
 static int inject_init(void)
 {
+       if (!alloc_cpumask_var(&mce_inject_cpumask, GFP_KERNEL))
+               return -ENOMEM;
        printk(KERN_INFO "Machine check injector initialized\n");
        mce_chrdev_ops.write = mce_write;
        register_die_notifier(&mce_raise_nb);