Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 911a62d4 authored by Venkatesh Pallipadi's avatar Venkatesh Pallipadi Committed by Linus Torvalds
Browse files

[PATCH] x86: sutomatically enable bigsmp when we have more than 8 CPUs



i386 generic subarchitecture requires explicit dmi strings or command line
to enable bigsmp mode.  The patch below removes that restriction, and uses
bigsmp as soon as it finds more than 8 logical CPUs, Intel processors and
xAPIC support.

Signed-off-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 484b90c4
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -833,6 +833,9 @@ acpi_process_madt(void)
		if (!error) {
			acpi_lapic = 1;

#ifdef CONFIG_X86_GENERICARCH
			generic_bigsmp_probe();
#endif
			/*
			 * Parse MADT IO-APIC entries
			 */
+9 −0
Original line number Diff line number Diff line
@@ -65,6 +65,8 @@ int nr_ioapics;
int pic_mode;
unsigned long mp_lapic_addr;

unsigned int def_to_bigsmp = 0;

/* Processor that is doing the boot up */
unsigned int boot_cpu_physical_apicid = -1U;
/* Internal processor count */
@@ -213,6 +215,13 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
		ver = 0x10;
	}
	apic_version[m->mpc_apicid] = ver;
	if ((num_processors > 8) &&
	    APIC_XAPIC(ver) &&
	    (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL))
		def_to_bigsmp = 1;
	else
		def_to_bigsmp = 0;

	bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
}

+7 −1
Original line number Diff line number Diff line
@@ -1585,8 +1585,14 @@ void __init setup_arch(char **cmdline_p)
	 */
	acpi_boot_table_init();
	acpi_boot_init();
#endif

#if defined(CONFIG_SMP) && defined(CONFIG_X86_PC)
	if (def_to_bigsmp)
		printk(KERN_WARNING "More than 8 CPUs detected and "
			"CONFIG_X86_PC cannot handle it.\nUse "
			"CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");
#endif
#endif
#ifdef CONFIG_X86_LOCAL_APIC
	if (smp_found_config)
		get_smp_config();
+4 −1
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ static struct dmi_system_id __initdata bigsmp_dmi_table[] = {

static __init int probe_bigsmp(void)
{ 
	if (def_to_bigsmp)
        	dmi_bigsmp = 1;
	else
		dmi_check_system(bigsmp_dmi_table);
	return dmi_bigsmp; 
} 
+20 −0
Original line number Diff line number Diff line
@@ -30,6 +30,25 @@ struct genapic *apic_probe[] __initdata = {
	NULL,
};

static int cmdline_apic;

void __init generic_bigsmp_probe(void)
{
	/*
	 * This routine is used to switch to bigsmp mode when
	 * - There is no apic= option specified by the user
	 * - generic_apic_probe() has choosen apic_default as the sub_arch
	 * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support
	 */

	if (!cmdline_apic && genapic == &apic_default)
		if (apic_bigsmp.probe()) {
			genapic = &apic_bigsmp;
			printk(KERN_INFO "Overriding APIC driver with %s\n",
			       genapic->name);
		}
}

void __init generic_apic_probe(char *command_line) 
{ 
	char *s;
@@ -52,6 +71,7 @@ void __init generic_apic_probe(char *command_line)
		if (!changed)
			printk(KERN_ERR "Unknown genapic `%s' specified.\n", s);
		*p = old;
		cmdline_apic = changed;
	} 
	for (i = 0; !changed && apic_probe[i]; i++) { 
		if (apic_probe[i]->probe()) {
Loading