Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754556Ab0BJJXi (ORCPT ); Wed, 10 Feb 2010 04:23:38 -0500 Received: from sca-es-mail-1.Sun.COM ([192.18.43.132]:60149 "EHLO sca-es-mail-1.sun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754233Ab0BJJWO (ORCPT ); Wed, 10 Feb 2010 04:22:14 -0500 MIME-version: 1.0 Content-transfer-encoding: 7BIT Content-type: TEXT/PLAIN Date: Wed, 10 Feb 2010 01:20:39 -0800 From: Yinghai Lu Subject: [PATCH 35/35] x86: make 32bit apic flat to physflat switch like 64bit In-reply-to: <1265793639-15071-1-git-send-email-yinghai@kernel.org> To: Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , Andrew Morton , Linus Torvalds Cc: Jesse Barnes , Christoph Lameter , linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, Yinghai Lu Message-id: <1265793639-15071-36-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.6.4.2 References: <1265793639-15071-1-git-send-email-yinghai@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9769 Lines: 358 kill def_to_bigsmp and move switch from default to bigsmp at default_setup_apic_routing... so make default_setup_apic_routing more like 64 bit also make the dmi relate code to be __init/__initdata -v2: refresh it according to change in upstream Signed-off-by: Yinghai Lu --- arch/x86/include/asm/apic.h | 3 - arch/x86/include/asm/mpspec.h | 1 - arch/x86/kernel/apic/bigsmp_32.c | 48 +--------------- arch/x86/kernel/apic/probe_32.c | 115 ++++++++++++++++++++------------------ arch/x86/kernel/apic/probe_64.c | 2 +- arch/x86/kernel/setup.c | 2 - arch/x86/kernel/smpboot.c | 2 +- 7 files changed, 65 insertions(+), 108 deletions(-) diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index b4ac2cd..d544523 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h @@ -456,9 +456,6 @@ static inline void default_wait_for_init_deassert(atomic_t *deassert) return; } -extern void generic_bigsmp_probe(void); - - #ifdef CONFIG_X86_LOCAL_APIC #include diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h index d8bf23a..b4b295c 100644 --- a/arch/x86/include/asm/mpspec.h +++ b/arch/x86/include/asm/mpspec.h @@ -23,7 +23,6 @@ extern int pic_mode; #define MAX_IRQ_SOURCES 256 -extern unsigned int def_to_bigsmp; extern u8 apicid_2_node[]; #ifdef CONFIG_X86_NUMAQ diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c index cb804c5..350d60e 100644 --- a/arch/x86/kernel/apic/bigsmp_32.c +++ b/arch/x86/kernel/apic/bigsmp_32.c @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -73,13 +72,6 @@ static void bigsmp_init_apic_ldr(void) apic_write(APIC_LDR, val); } -static void bigsmp_setup_apic_routing(void) -{ - printk(KERN_INFO - "Enabling APIC mode: Physflat. Using %d I/O APICs\n", - nr_ioapics); -} - static int bigsmp_apicid_to_node(int logical_apicid) { return apicid_2_node[hard_smp_processor_id()]; @@ -154,52 +146,16 @@ static void bigsmp_send_IPI_all(int vector) bigsmp_send_IPI_mask(cpu_online_mask, vector); } -static int dmi_bigsmp; /* can be set by dmi scanners */ - -static int hp_ht_bigsmp(const struct dmi_system_id *d) -{ - printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident); - dmi_bigsmp = 1; - - return 0; -} - - -static const struct dmi_system_id bigsmp_dmi_table[] = { - { hp_ht_bigsmp, "HP ProLiant DL760 G2", - { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), - DMI_MATCH(DMI_BIOS_VERSION, "P44-"), - } - }, - - { hp_ht_bigsmp, "HP ProLiant DL740", - { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), - DMI_MATCH(DMI_BIOS_VERSION, "P47-"), - } - }, - { } /* NULL entry stops DMI scanning */ -}; - static void bigsmp_vector_allocation_domain(int cpu, struct cpumask *retmask) { cpumask_clear(retmask); cpumask_set_cpu(cpu, retmask); } -static int probe_bigsmp(void) -{ - if (def_to_bigsmp) - dmi_bigsmp = 1; - else - dmi_check_system(bigsmp_dmi_table); - - return dmi_bigsmp; -} - struct apic apic_bigsmp = { .name = "bigsmp", - .probe = probe_bigsmp, + .probe = NULL, .acpi_madt_oem_check = NULL, .apic_id_registered = bigsmp_apic_id_registered, @@ -217,7 +173,7 @@ struct apic apic_bigsmp = { .init_apic_ldr = bigsmp_init_apic_ldr, .ioapic_phys_id_map = bigsmp_ioapic_phys_id_map, - .setup_apic_routing = bigsmp_setup_apic_routing, + .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = bigsmp_apicid_to_node, .cpu_to_logical_apicid = bigsmp_cpu_to_logical_apicid, diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c index 99d2fe0..874f9a3 100644 --- a/arch/x86/kernel/apic/probe_32.c +++ b/arch/x86/kernel/apic/probe_32.c @@ -14,6 +14,8 @@ #include #include #include +#include + #include #include #include @@ -52,40 +54,6 @@ static int __init print_ipi_mode(void) } late_initcall(print_ipi_mode); -void __init default_setup_apic_routing(void) -{ - int version = apic_version[boot_cpu_physical_apicid]; - - if (num_possible_cpus() > 8) { - switch (boot_cpu_data.x86_vendor) { - case X86_VENDOR_INTEL: - if (!APIC_XAPIC(version)) { - def_to_bigsmp = 0; - break; - } - /* If P4 and above fall through */ - case X86_VENDOR_AMD: - def_to_bigsmp = 1; - } - } - -#ifdef CONFIG_X86_BIGSMP - generic_bigsmp_probe(); -#endif - - if (apic->setup_apic_routing) - apic->setup_apic_routing(); -} - -static void setup_apic_flat_routing(void) -{ -#ifdef CONFIG_X86_IO_APIC - printk(KERN_INFO - "Enabling APIC mode: Flat. Using %d I/O APICs\n", - nr_ioapics); -#endif -} - static void default_vector_allocation_domain(int cpu, struct cpumask *retmask) { /* @@ -101,16 +69,10 @@ static void default_vector_allocation_domain(int cpu, struct cpumask *retmask) cpumask_bits(retmask)[0] = APIC_ALL_CPUS; } -/* should be called last. */ -static int probe_default(void) -{ - return 1; -} - struct apic apic_default = { .name = "default", - .probe = probe_default, + .probe = NULL, .acpi_madt_oem_check = NULL, .apic_id_registered = default_apic_id_registered, @@ -128,7 +90,7 @@ struct apic apic_default = { .init_apic_ldr = default_init_apic_ldr, .ioapic_phys_id_map = default_ioapic_phys_id_map, - .setup_apic_routing = setup_apic_flat_routing, + .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = default_apicid_to_node, .cpu_to_logical_apicid = default_cpu_to_logical_apicid, @@ -217,24 +179,70 @@ static int __init parse_apic(char *arg) } early_param("apic", parse_apic); -void __init generic_bigsmp_probe(void) +static int dmi_bigsmp __initdata; /* can be set by dmi scanners */ + +static int __init hp_ht_bigsmp(const struct dmi_system_id *d) +{ + printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident); + dmi_bigsmp = 1; + + return 0; +} + +static struct dmi_system_id bigsmp_dmi_table[] __initdata = { + { hp_ht_bigsmp, "HP ProLiant DL760 G2", + { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), + DMI_MATCH(DMI_BIOS_VERSION, "P44-"), + } + }, + + { hp_ht_bigsmp, "HP ProLiant DL740", + { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), + DMI_MATCH(DMI_BIOS_VERSION, "P47-"), + } + }, + { } /* NULL entry stops DMI scanning */ +}; + +static inline const char *get_apic_name(struct apic *apic) +{ + if (apic == &apic_default) + return "flat"; +#ifdef CONFIG_X86_BIGSMP + if (apic == &apic_bigsmp) + return "physical flat"; +#endif + return apic->name; +} + +void __init default_setup_apic_routing(void) { #ifdef CONFIG_X86_BIGSMP /* - * This routine is used to switch to bigsmp mode when - * - There is no apic= option specified by the user - * - generic_apic_probe() has chosen apic_default as the sub_arch - * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support + * make sure we go to bigsmp according to real nr_cpu_ids */ - if (!cmdline_apic && apic == &apic_default) { - if (apic_bigsmp.probe()) { + if (nr_cpu_ids > 8) apic = &apic_bigsmp; - printk(KERN_INFO "Overriding APIC driver with %s\n", - apic->name); + else { + dmi_check_system(bigsmp_dmi_table); + if (dmi_bigsmp) + apic = &apic_bigsmp; } + if (apic != &apic_default) + printk(KERN_INFO "Overriding APIC driver with %s\n", + get_apic_name(apic)); } #endif + if (apic->setup_apic_routing) + apic->setup_apic_routing(); + else { +#ifdef CONFIG_X86_IO_APIC + printk(KERN_INFO + "Enabling APIC mode: %s. Using %d I/O APICs\n", + get_apic_name(apic), nr_ioapics); +#endif + } } void __init generic_apic_probe(void) @@ -242,14 +250,13 @@ void __init generic_apic_probe(void) if (!cmdline_apic) { int i; for (i = 0; apic_probe[i]; i++) { + if (!apic_probe[i]->probe) + continue; if (apic_probe[i]->probe()) { apic = apic_probe[i]; break; } } - /* Not visible without early console */ - if (!apic_probe[i]) - panic("Didn't find an APIC driver"); } printk(KERN_INFO "Using APIC driver %s\n", apic->name); } diff --git a/arch/x86/kernel/apic/probe_64.c b/arch/x86/kernel/apic/probe_64.c index 83e9be4..ea25de8 100644 --- a/arch/x86/kernel/apic/probe_64.c +++ b/arch/x86/kernel/apic/probe_64.c @@ -67,7 +67,7 @@ void __init default_setup_apic_routing(void) } #endif - if (apic == &apic_flat && num_possible_cpus() > 8) + if (apic == &apic_flat && nr_cpu_ids > 8) apic = &apic_physflat; printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index d49e168..17759b7 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -184,8 +184,6 @@ static void set_mca_bus(int x) #endif } -unsigned int def_to_bigsmp; - /* for MCA, but anyone else can use it if they want */ unsigned int machine_id; unsigned int machine_submodel_id; diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 51ec4b6..2a25e74 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -950,7 +950,7 @@ static int __init smp_sanity_check(unsigned max_cpus) preempt_disable(); #if !defined(CONFIG_X86_BIGSMP) && defined(CONFIG_X86_32) - if (def_to_bigsmp && nr_cpu_ids > 8) { + if (apic == &apic_default && nr_cpu_ids > 8) { unsigned int cpu; unsigned nr; -- 1.6.4.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/