diff options
| -rw-r--r-- | arch/x86/kernel/microcode_core.c | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c index a0f3851ef310..2e0eb4140951 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/microcode_core.c | |||
| @@ -108,40 +108,29 @@ struct ucode_cpu_info ucode_cpu_info[NR_CPUS]; | |||
| 108 | EXPORT_SYMBOL_GPL(ucode_cpu_info); | 108 | EXPORT_SYMBOL_GPL(ucode_cpu_info); |
| 109 | 109 | ||
| 110 | #ifdef CONFIG_MICROCODE_OLD_INTERFACE | 110 | #ifdef CONFIG_MICROCODE_OLD_INTERFACE |
| 111 | struct update_for_cpu { | ||
| 112 | const void __user *buf; | ||
| 113 | size_t size; | ||
| 114 | }; | ||
| 115 | |||
| 116 | static long update_for_cpu(void *_ufc) | ||
| 117 | { | ||
| 118 | struct update_for_cpu *ufc = _ufc; | ||
| 119 | int error; | ||
| 120 | |||
| 121 | error = microcode_ops->request_microcode_user(smp_processor_id(), | ||
| 122 | ufc->buf, ufc->size); | ||
| 123 | if (error < 0) | ||
| 124 | return error; | ||
| 125 | if (!error) | ||
| 126 | microcode_ops->apply_microcode(smp_processor_id()); | ||
| 127 | return error; | ||
| 128 | } | ||
| 129 | |||
| 130 | static int do_microcode_update(const void __user *buf, size_t size) | 111 | static int do_microcode_update(const void __user *buf, size_t size) |
| 131 | { | 112 | { |
| 113 | cpumask_t old; | ||
| 132 | int error = 0; | 114 | int error = 0; |
| 133 | int cpu; | 115 | int cpu; |
| 134 | struct update_for_cpu ufc = { .buf = buf, .size = size }; | 116 | |
| 117 | old = current->cpus_allowed; | ||
| 135 | 118 | ||
| 136 | for_each_online_cpu(cpu) { | 119 | for_each_online_cpu(cpu) { |
| 137 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu; | 120 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu; |
| 138 | 121 | ||
| 139 | if (!uci->valid) | 122 | if (!uci->valid) |
| 140 | continue; | 123 | continue; |
| 141 | error = work_on_cpu(cpu, update_for_cpu, &ufc); | 124 | |
| 125 | set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu)); | ||
| 126 | error = microcode_ops->request_microcode_user(cpu, buf, size); | ||
| 142 | if (error < 0) | 127 | if (error < 0) |
| 143 | break; | 128 | goto out; |
| 129 | if (!error) | ||
| 130 | microcode_ops->apply_microcode(cpu); | ||
| 144 | } | 131 | } |
| 132 | out: | ||
| 133 | set_cpus_allowed_ptr(current, &old); | ||
| 145 | return error; | 134 | return error; |
| 146 | } | 135 | } |
| 147 | 136 | ||
