Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753228Ab0ALMKn (ORCPT ); Tue, 12 Jan 2010 07:10:43 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752410Ab0ALMK3 (ORCPT ); Tue, 12 Jan 2010 07:10:29 -0500 Received: from sca-es-mail-1.Sun.COM ([192.18.43.132]:48324 "EHLO sca-es-mail-1.sun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932070Ab0ALMK1 (ORCPT ); Tue, 12 Jan 2010 07:10:27 -0500 MIME-version: 1.0 Content-transfer-encoding: 7BIT Content-type: TEXT/PLAIN Date: Tue, 12 Jan 2010 04:09:05 -0800 From: Yinghai Lu Subject: [RFC PATCH -v2 2/5] x86: use dmi check to treat disabled cpus as hotplug cpus. In-reply-to: <1263298146-25597-1-git-send-email-yinghai@kernel.org> To: Suresh Siddha , Linus Torvalds , "ananth@in.ibm.com" , Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , Andrew Morton Cc: linux-kernel@vger.kernel.org, Yinghai Lu Message-id: <1263298146-25597-4-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.6.4.2 References: <1263298146-25597-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: 4417 Lines: 123 some systems that have disable cpus entries because same BIOS will support 2 sockets and 4 sockets and more at same time, BIOS just leave some disable entries, but those system do not support cpu hotplug. we don't need treat disabled_cpus as hotplug cpus. so we can make nr_cpu_ids smaller and save more space (pcpu data allocations), and could make some systems run with logical flat instead of physical flat apic mode -v2: change to black list instead Signed-off-by: Yinghai Lu --- arch/x86/kernel/smpboot.c | 76 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) Index: linux-2.6/arch/x86/kernel/smpboot.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/smpboot.c +++ linux-2.6/arch/x86/kernel/smpboot.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -1180,6 +1181,59 @@ static int __init _setup_possible_cpus(c } early_param("possible_cpus", _setup_possible_cpus); +static __initdata int treat_disabled_cpus_as_hotplug = 1; +static __init int hotplug_cpus_check(const struct dmi_system_id *d) +{ + printk(KERN_NOTICE "%s detected: treat disabled cpus as hotplug ones\n", d->ident); + treat_disabled_cpus_as_hotplug = 0; + + return 0; +} + +static struct dmi_system_id hotplug_cpus_dmi_table[] __initdata = { + { + .callback = hotplug_cpus_check, + .ident = "Sun Microsystems Sun Fire X4440", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sun Microsystems"), + DMI_MATCH(DMI_PRODUCT_NAME, "Sun Fire X4440"), + }, + }, + { + .callback = hotplug_cpus_check, + .ident = "Sun Microsystems Sun Fire X4240", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sun Microsystems"), + DMI_MATCH(DMI_PRODUCT_NAME, "Sun Fire X4240"), + }, + }, + { + .callback = hotplug_cpus_check, + .ident = "Sun Microsystems Sun Fire X4140", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sun Microsystems"), + DMI_MATCH(DMI_PRODUCT_NAME, "Sun Fire X4140"), + }, + }, + { + .callback = hotplug_cpus_check, + .ident = "Sun Microsystems Sun Fire X4600", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sun Microsystems"), + DMI_MATCH(DMI_PRODUCT_NAME, "Sun Fire X4600"), + }, + }, + { + .callback = hotplug_cpus_check, + .ident = "Sun Microsystems Sun Fire X4640", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sun Microsystems"), + DMI_MATCH(DMI_PRODUCT_NAME, "Sun Fire X4640"), + }, + }, + { } /* NULL entry stops DMI scanning */ +}; + /* * cpu_possible_mask should be static, it cannot change as cpu's @@ -1206,8 +1260,26 @@ __init void prefill_possible_map(void) if (!num_processors) num_processors = 1; - if (setup_possible_cpus == -1) - possible = num_processors + disabled_cpus; + if (setup_possible_cpus == -1) { + possible = num_processors; + /* + * do we have better way to detect hotplug cpus? + * + * some systems that have disable cpus entries because same + * BIOS will support 2 sockets and 4 sockets and more at + * same time, BIOS just leave some disabled entries with wild + * apicid, but those system do not support cpu hotplug. + * we don't need treat disabled_cpus as hotplug cpus. + * so we can make nr_cpu_ids smaller and save more space + * (pcpu data allocations), and could make some systems run + * with logical flat instead of physical flat apic mode + */ + if (disabled_cpus) { + dmi_check_system(hotplug_cpus_dmi_table); + if (treat_disabled_cpus_as_hotplug) + possible += disabled_cpus; + } + } else possible = setup_possible_cpus; -- 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/