Commit 5cf6c541 authored by Dave Jones's avatar Dave Jones Committed by Linus Torvalds

[PATCH] x86 microcode driver vs hotplug CPUs.

This driver loops over 'num_online_cpus', but it doesn't account for holes
in the online map created by offlined cpus, and assumes that the cpu
numbers stay linear.
Signed-off-by: default avatarDave Jones <davej@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ec72070b
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/cpumask.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
...@@ -250,8 +251,8 @@ static int find_matching_ucodes (void) ...@@ -250,8 +251,8 @@ static int find_matching_ucodes (void)
error = -EINVAL; error = -EINVAL;
goto out; goto out;
} }
for (cpu_num = 0; cpu_num < num_online_cpus(); cpu_num++) { for_each_online_cpu(cpu_num) {
struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;
if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/ if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/
continue; continue;
...@@ -293,7 +294,7 @@ static int find_matching_ucodes (void) ...@@ -293,7 +294,7 @@ static int find_matching_ucodes (void)
error = -EFAULT; error = -EFAULT;
goto out; goto out;
} }
for (cpu_num = 0; cpu_num < num_online_cpus(); cpu_num++) { for_each_online_cpu(cpu_num) {
struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;
if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/ if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/
continue; continue;
...@@ -304,7 +305,9 @@ static int find_matching_ucodes (void) ...@@ -304,7 +305,9 @@ static int find_matching_ucodes (void)
} }
} }
/* now check if any cpu has matched */ /* now check if any cpu has matched */
for (cpu_num = 0, allocated_flag = 0, sum = 0; cpu_num < num_online_cpus(); cpu_num++) { allocated_flag = 0;
sum = 0;
for_each_online_cpu(cpu_num) {
if (ucode_cpu_info[cpu_num].err == MC_MARKED) { if (ucode_cpu_info[cpu_num].err == MC_MARKED) {
struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;
if (!allocated_flag) { if (!allocated_flag) {
...@@ -415,12 +418,12 @@ static int do_microcode_update (void) ...@@ -415,12 +418,12 @@ static int do_microcode_update (void)
} }
out_free: out_free:
for (i = 0; i < num_online_cpus(); i++) { for_each_online_cpu(i) {
if (ucode_cpu_info[i].mc) { if (ucode_cpu_info[i].mc) {
int j; int j;
void *tmp = ucode_cpu_info[i].mc; void *tmp = ucode_cpu_info[i].mc;
vfree(tmp); vfree(tmp);
for (j = i; j < num_online_cpus(); j++) { for_each_online_cpu(j) {
if (ucode_cpu_info[j].mc == tmp) if (ucode_cpu_info[j].mc == tmp)
ucode_cpu_info[j].mc = NULL; ucode_cpu_info[j].mc = NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment