Skip to content

Commit

Permalink
x86: resurrect proper handling of maxcpus= kernel option (v2)
Browse files Browse the repository at this point in the history
For some reason we had two parsers registered for maxcpus=. One in init/main.c
and another in arch/x86/smpboot.c. So I nuked the one in arch/x86.

Also 64-bit kernels used to handle maxcpus= as documented in
Documentation/cpu-hotplug.txt. CPUs with 'id > maxcpus' are initialized
but not booted. 32-bit version for some reason ignored them even though
all the infrastructure for booting them later is there.

In the current mainline both 64 and 32 bit versions are broken.
This patch restores the correct behaviour. I've tested x86_64 version on
4- and 8- way Core2 and 2-way Opteron based machines. Various config
combinations SMP, !SMP, CPU_HOTPLUG, !CPU_HOTPLUG.
Booted with maxcpus=1 and maxcpus=4, etc. Everything is working as expected.

So far we've received two reports from different people confirming that 32-bit
version also works fine, both on dual core laptops and 16way server machines.

[v2: This version fixes visws breakage pointed out by Ingo.]

Signed-off-by: Max Krasnyansky <maxk@qualcomm.com>
Cc: lizf@cn.fujitsu.com
Cc: jeff.chua.linux@gmail.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Max Krasnyansky authored and Ingo Molnar committed Aug 14, 2008
1 parent 3167761 commit 23b49c1
Show file tree
Hide file tree
Showing 4 changed files with 2 additions and 33 deletions.
8 changes: 0 additions & 8 deletions arch/x86/kernel/apic_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -1454,8 +1454,6 @@ void disconnect_bsp_APIC(int virt_wire_setup)
}
}

unsigned int __cpuinitdata maxcpus = NR_CPUS;

void __cpuinit generic_processor_info(int apicid, int version)
{
int cpu;
Expand All @@ -1482,12 +1480,6 @@ void __cpuinit generic_processor_info(int apicid, int version)
return;
}

if (num_processors >= maxcpus) {
printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
" Processor ignored.\n", maxcpus);
return;
}

num_processors++;
cpus_complement(tmp_map, cpu_present_map);
cpu = first_cpu(tmp_map);
Expand Down
7 changes: 0 additions & 7 deletions arch/x86/kernel/apic_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ static unsigned long apic_phys;

unsigned long mp_lapic_addr;

unsigned int __cpuinitdata maxcpus = NR_CPUS;
/*
* Get the LAPIC version
*/
Expand Down Expand Up @@ -1062,12 +1061,6 @@ void __cpuinit generic_processor_info(int apicid, int version)
return;
}

if (num_processors >= maxcpus) {
printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
" Processor ignored.\n", maxcpus);
return;
}

num_processors++;
cpus_complement(tmp_map, cpu_present_map);
cpu = first_cpu(tmp_map);
Expand Down
14 changes: 0 additions & 14 deletions arch/x86/kernel/smpboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -1386,17 +1386,3 @@ void __cpu_die(unsigned int cpu)
BUG();
}
#endif

/*
* If the BIOS enumerates physical processors before logical,
* maxcpus=N at enumeration-time can be used to disable HT.
*/
static int __init parse_maxcpus(char *arg)
{
extern unsigned int maxcpus;

if (arg)
maxcpus = simple_strtoul(arg, NULL, 0);
return 0;
}
early_param("maxcpus", parse_maxcpus);
6 changes: 2 additions & 4 deletions arch/x86/kernel/visws_quirks.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,6 @@ static int __init visws_get_smp_config(unsigned int early)
return 1;
}

extern unsigned int __cpuinitdata maxcpus;

/*
* The Visual Workstation is Intel MP compliant in the hardware
* sense, but it doesn't have a BIOS(-configuration table).
Expand Down Expand Up @@ -244,8 +242,8 @@ static int __init visws_find_smp_config(unsigned int reserve)
ncpus = CO_CPU_MAX;
}

if (ncpus > maxcpus)
ncpus = maxcpus;
if (ncpus > setup_max_cpus)
ncpus = setup_max_cpus;

#ifdef CONFIG_X86_LOCAL_APIC
smp_found_config = 1;
Expand Down

0 comments on commit 23b49c1

Please sign in to comment.