[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>
This commit is contained in:
committed by
Linus Torvalds
parent
751521149a
commit
18a2b64712
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user