Messages in this thread | | | Subject | Re: [PATCH -v2 5/5] x86: use dmi check to treat disabled cpus as hotplug cpus. | From | Suresh Siddha <> | Date | Tue, 12 Jan 2010 15:56:02 -0800 |
| |
On Tue, 2010-01-12 at 15:17 -0800, Yinghai Lu wrote: > 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
I don't think this list will work because every HT system with HT disabled in the bios shows that logical cpu as disabled.
> Signed-off-by: Yinghai Lu <yinghai@kernel.org> > > --- > 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 <linux/bootmem.h> > #include <linux/err.h> > #include <linux/nmi.h> > +#include <linux/dmi.h> > #include <linux/tboot.h> > > #include <asm/acpi.h> > @@ -1178,6 +1179,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 > @@ -1204,8 +1258,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; >
| |