diff options
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce-inject.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c index 472763d92098..73734baa50f2 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-inject.c +++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c | |||
| @@ -74,7 +74,7 @@ static void raise_exception(struct mce *m, struct pt_regs *pregs) | |||
| 74 | m->finished = 0; | 74 | m->finished = 0; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | static cpumask_t mce_inject_cpumask; | 77 | static cpumask_var_t mce_inject_cpumask; |
| 78 | 78 | ||
| 79 | static int mce_raise_notify(struct notifier_block *self, | 79 | static int mce_raise_notify(struct notifier_block *self, |
| 80 | unsigned long val, void *data) | 80 | unsigned long val, void *data) |
| @@ -82,9 +82,9 @@ static int mce_raise_notify(struct notifier_block *self, | |||
| 82 | struct die_args *args = (struct die_args *)data; | 82 | struct die_args *args = (struct die_args *)data; |
| 83 | int cpu = smp_processor_id(); | 83 | int cpu = smp_processor_id(); |
| 84 | struct mce *m = &__get_cpu_var(injectm); | 84 | struct mce *m = &__get_cpu_var(injectm); |
| 85 | if (val != DIE_NMI_IPI || !cpu_isset(cpu, mce_inject_cpumask)) | 85 | if (val != DIE_NMI_IPI || !cpumask_test_cpu(cpu, mce_inject_cpumask)) |
| 86 | return NOTIFY_DONE; | 86 | return NOTIFY_DONE; |
| 87 | cpu_clear(cpu, mce_inject_cpumask); | 87 | cpumask_clear_cpu(cpu, mce_inject_cpumask); |
| 88 | if (m->inject_flags & MCJ_EXCEPTION) | 88 | if (m->inject_flags & MCJ_EXCEPTION) |
| 89 | raise_exception(m, args->regs); | 89 | raise_exception(m, args->regs); |
| 90 | else if (m->status) | 90 | else if (m->status) |
| @@ -148,22 +148,22 @@ static void raise_mce(struct mce *m) | |||
| 148 | unsigned long start; | 148 | unsigned long start; |
| 149 | int cpu; | 149 | int cpu; |
| 150 | get_online_cpus(); | 150 | get_online_cpus(); |
| 151 | mce_inject_cpumask = cpu_online_map; | 151 | cpumask_copy(mce_inject_cpumask, cpu_online_mask); |
| 152 | cpu_clear(get_cpu(), mce_inject_cpumask); | 152 | cpumask_clear_cpu(get_cpu(), mce_inject_cpumask); |
| 153 | for_each_online_cpu(cpu) { | 153 | for_each_online_cpu(cpu) { |
| 154 | struct mce *mcpu = &per_cpu(injectm, cpu); | 154 | struct mce *mcpu = &per_cpu(injectm, cpu); |
| 155 | if (!mcpu->finished || | 155 | if (!mcpu->finished || |
| 156 | MCJ_CTX(mcpu->inject_flags) != MCJ_CTX_RANDOM) | 156 | MCJ_CTX(mcpu->inject_flags) != MCJ_CTX_RANDOM) |
| 157 | cpu_clear(cpu, mce_inject_cpumask); | 157 | cpumask_clear_cpu(cpu, mce_inject_cpumask); |
| 158 | } | 158 | } |
| 159 | if (!cpus_empty(mce_inject_cpumask)) | 159 | if (!cpumask_empty(mce_inject_cpumask)) |
| 160 | apic->send_IPI_mask(&mce_inject_cpumask, NMI_VECTOR); | 160 | apic->send_IPI_mask(mce_inject_cpumask, NMI_VECTOR); |
| 161 | start = jiffies; | 161 | start = jiffies; |
| 162 | while (!cpus_empty(mce_inject_cpumask)) { | 162 | while (!cpumask_empty(mce_inject_cpumask)) { |
| 163 | if (!time_before(jiffies, start + 2*HZ)) { | 163 | if (!time_before(jiffies, start + 2*HZ)) { |
| 164 | printk(KERN_ERR | 164 | printk(KERN_ERR |
| 165 | "Timeout waiting for mce inject NMI %lx\n", | 165 | "Timeout waiting for mce inject NMI %lx\n", |
| 166 | *cpus_addr(mce_inject_cpumask)); | 166 | *cpumask_bits(mce_inject_cpumask)); |
| 167 | break; | 167 | break; |
| 168 | } | 168 | } |
| 169 | cpu_relax(); | 169 | cpu_relax(); |
| @@ -210,6 +210,8 @@ static ssize_t mce_write(struct file *filp, const char __user *ubuf, | |||
| 210 | 210 | ||
| 211 | static int inject_init(void) | 211 | static int inject_init(void) |
| 212 | { | 212 | { |
| 213 | if (!alloc_cpumask_var(&mce_inject_cpumask, GFP_KERNEL)) | ||
| 214 | return -ENOMEM; | ||
| 213 | printk(KERN_INFO "Machine check injector initialized\n"); | 215 | printk(KERN_INFO "Machine check injector initialized\n"); |
| 214 | mce_chrdev_ops.write = mce_write; | 216 | mce_chrdev_ops.write = mce_write; |
| 215 | register_die_notifier(&mce_raise_nb); | 217 | register_die_notifier(&mce_raise_nb); |
