Commit 0e559f50 authored by Len Brown's avatar Len Brown Committed by Len Brown

[ACPI] check "maxcpus=N" early -- same as NR_CPUS check.

http://bugzilla.kernel.org/show_bug.cgi?id=2317

When the BIOS enumerates physical processors before logical,
maxcpus=N/2 will now effectively disable HT.

This can be verified by boot messages warning that HT is off:
eg. "maxcpus=2" on a 2xHT system:

Total of 2 processors activated (11141.12 BogoMIPS).
WARNING: No sibling found for CPU 0.
WARNING: No sibling found for CPU 1.
parent fea5b72f
......@@ -37,6 +37,7 @@
/* Have we found an MP table */
int smp_found_config;
unsigned int __initdata maxcpus = NR_CPUS;
/*
* Various Linux-internal data structures created from the
......@@ -168,8 +169,14 @@ void __init MP_processor_info (struct mpc_config_processor *m)
}
if (num_processors >= NR_CPUS) {
printk(KERN_WARNING "NR_CPUS limit of %i reached. Cannot "
"boot CPU(apicid 0x%x).\n", NR_CPUS, m->mpc_apicid);
printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached."
" Processor ignored.\n", NR_CPUS);
return;
}
if (num_processors >= maxcpus) {
printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
" Processor ignored.\n", maxcpus);
return;
}
num_processors++;
......
......@@ -555,6 +555,18 @@ static void __init parse_cmdline_early (char ** cmdline_p)
}
}
#ifdef CONFIG_SMP
/*
* If the BIOS enumerates physical processors before logical,
* maxcpus=N at enumeration-time can be used to disable HT.
*/
else if (!memcmp(from, "maxcpus=", 8)) {
extern unsigned int maxcpus;
maxcpus = simple_strtoul(from + 8, NULL, 0);
}
#endif
#ifdef CONFIG_ACPI_BOOT
/* "acpi=off" disables both ACPI table parsing and interpreter */
else if (!memcmp(from, "acpi=off", 8)) {
......
......@@ -33,6 +33,7 @@
/* Have we found an MP table */
int smp_found_config;
unsigned int __initdata maxcpus = NR_CPUS;
int acpi_found_madt;
......@@ -117,6 +118,17 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
Dprintk(" Bootup CPU\n");
boot_cpu_id = m->mpc_apicid;
}
if (num_processors >= NR_CPUS) {
printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached."
" Processor ignored.\n", NR_CPUS);
return;
}
if (num_processors >= maxcpus) {
printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
" Processor ignored.\n", maxcpus);
return;
}
num_processors++;
if (m->mpc_apicid > MAX_APICS) {
......
......@@ -201,7 +201,18 @@ static __init void parse_cmdline_early (char ** cmdline_p)
for (;;) {
if (c != ' ')
goto next_char;
#ifdef CONFIG_SMP
/*
* If the BIOS enumerates physical processors before logical,
* maxcpus=N at enumeration-time can be used to disable HT.
*/
else if (!memcmp(from, "maxcpus=", 8)) {
extern unsigned int maxcpus;
maxcpus = simple_strtoul(from + 8, NULL, 0);
}
#endif
#ifdef CONFIG_ACPI_BOOT
/* "acpi=off" disables both ACPI table parsing and interpreter init */
if (!memcmp(from, "acpi=off", 8))
......
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