Преглед изворни кода

[PATCH] x86_64: Don't assume BSP has ID 0 in new smp bootup

This patch removes the assumption that LAPIC entries contain the BSP as its
first entry.  This is a slight improvement to the temporary fix submitted by
Suresh Siddha.

- Removes assumption that LAPIC entries contain BSP first.

- Builds x86_acpiid_to_apicid[] and bios_cpu_apicid[] properly with BSP as
  first entry.

- Made maxcpus=1 boot on these systems.  Since the parsing earlier in
  arch/x86_64/kernel/mpparse.c stopped after maxcpus entries, other entries
  were not processed, this causes kernel not to boot on these systems.

TBD: x86_acpiid_to_apicid and bios_cpu_apicid[] seem to be exactly the
     same.  This could be removed, but might need more work to cleanup.

Signed-off-by: Ashok Raj <ashok.raj@intel.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Andi Kleen пре 20 година
родитељ
комит
18a2b64712
2 измењених фајлова са 14 додато и 8 уклоњено
  1. 14 6
      arch/x86_64/kernel/mpparse.c
  2. 0 2
      arch/x86_64/kernel/smpboot.c

+ 14 - 6
arch/x86_64/kernel/mpparse.c

@@ -107,6 +107,7 @@ static int __init mpf_checksum(unsigned char *mp, int len)
 static void __init MP_processor_info (struct mpc_config_processor *m)
 static void __init MP_processor_info (struct mpc_config_processor *m)
 {
 {
 	int ver;
 	int ver;
+	static int found_bsp=0;
 
 
 	if (!(m->mpc_cpuflag & CPU_ENABLED))
 	if (!(m->mpc_cpuflag & CPU_ENABLED))
 		return;
 		return;
@@ -126,11 +127,6 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
 			" Processor ignored.\n", NR_CPUS);
 			" Processor ignored.\n", NR_CPUS);
 		return;
 		return;
 	}
 	}
-	if (num_processors >= maxcpus) {
-		printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
-			" Processor ignored.\n", maxcpus);
-		return;
-	}
 
 
 	num_processors++;
 	num_processors++;
 
 
@@ -150,7 +146,19 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
 		ver = 0x10;
 		ver = 0x10;
 	}
 	}
 	apic_version[m->mpc_apicid] = ver;
 	apic_version[m->mpc_apicid] = ver;
-	bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
+ 	if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
+ 		/*
+ 		 * bios_cpu_apicid is required to have processors listed
+ 		 * in same order as logical cpu numbers. Hence the first
+ 		 * entry is BSP, and so on.
+ 		 */
+ 		bios_cpu_apicid[0] = m->mpc_apicid;
+ 		x86_cpu_to_apicid[0] = m->mpc_apicid;
+ 		found_bsp = 1;
+ 	} else {
+ 		bios_cpu_apicid[num_processors - found_bsp] = m->mpc_apicid;
+ 		x86_cpu_to_apicid[num_processors - found_bsp] = m->mpc_apicid;
+ 	}
 }
 }
 
 
 static void __init MP_bus_info (struct mpc_config_bus *m)
 static void __init MP_bus_info (struct mpc_config_bus *m)

+ 0 - 2
arch/x86_64/kernel/smpboot.c

@@ -645,7 +645,6 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid)
 		printk("failed fork for CPU %d\n", cpu);
 		printk("failed fork for CPU %d\n", cpu);
 		return PTR_ERR(idle);
 		return PTR_ERR(idle);
 	}
 	}
-	x86_cpu_to_apicid[cpu] = apicid;
 
 
 	cpu_pda[cpu].pcurrent = idle;
 	cpu_pda[cpu].pcurrent = idle;
 
 
@@ -954,7 +953,6 @@ void __cpuinit smp_prepare_cpus(unsigned int max_cpus)
 		      GET_APIC_ID(apic_read(APIC_ID)), boot_cpu_id);
 		      GET_APIC_ID(apic_read(APIC_ID)), boot_cpu_id);
 		/* Or can we switch back to PIC here? */
 		/* Or can we switch back to PIC here? */
 	}
 	}
-	x86_cpu_to_apicid[0] = boot_cpu_id;
 
 
 	/*
 	/*
 	 * Now start the IO-APICs
 	 * Now start the IO-APICs