x86 microcode driver vs hotplug CPUs.

From: Dave Jones
Date: Thu Feb 23 2006 - 20:36:26 EST


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: Dave Jones <davej@xxxxxxxxxx>

--- linux-2.6.15.noarch/arch/i386/kernel/microcode.c~ 2006-02-18 14:41:09.000000000 -0500
+++ linux-2.6.15.noarch/arch/i386/kernel/microcode.c 2006-02-18 14:45:42.000000000 -0500
@@ -250,8 +250,8 @@ static int find_matching_ucodes (void)
error = -EINVAL;
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;
if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/
continue;
@@ -293,7 +293,7 @@ static int find_matching_ucodes (void)
error = -EFAULT;
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;
if (uci->err != MC_NOTFOUND) /* already found a match or not an online cpu*/
continue;
@@ -304,7 +304,9 @@ static int find_matching_ucodes (void)
}
}
/* 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) {
struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;
if (!allocated_flag) {
@@ -415,12 +415,12 @@ static int do_microcode_update (void)
}

out_free:
- for (i = 0; i < num_online_cpus(); i++) {
+ for_each_online_cpu(i) {
if (ucode_cpu_info[i].mc) {
int j;
void *tmp = ucode_cpu_info[i].mc;
vfree(tmp);
- for (j = i; j < num_online_cpus(); j++) {
+ for_each_online_cpu(j) {
if (ucode_cpu_info[j].mc == tmp)
ucode_cpu_info[j].mc = NULL;
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/