Skip to content

Commit

Permalink
x86, apic: use logical flat for systems with <= 8 logical cpus
Browse files Browse the repository at this point in the history
We can use logical flat mode if there are <= 8 logical cpu's
(irrespective of physical apic id values).  This will enable simplified
and efficient IPI and device interrupt routing on such platforms.

This has been tested to work on both Intel and AMD platforms.
Exceptions like IBM summit platform which can't use logical flat mode
are addressed by using OEM platform checks.

Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Chris McDermott <lcm@linux.vnet.ibm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Suresh Siddha authored and Linus Torvalds committed Jan 18, 2010
1 parent dfea91d commit bb668da
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 19 deletions.
15 changes: 1 addition & 14 deletions arch/x86/kernel/apic/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,6 @@ unsigned int boot_cpu_physical_apicid = -1U;

/*
* The highest APIC ID seen during enumeration.
*
* This determines the messaging protocol we can use: if all APIC IDs
* are in the 0 ... 7 range, then we can use logical addressing which
* has some performance advantages (better broadcasting).
*
* If there's an APIC ID above 8, we use physical addressing.
*/
unsigned int max_physical_apicid;

Expand Down Expand Up @@ -1898,14 +1892,7 @@ void __cpuinit generic_processor_info(int apicid, int version)
max_physical_apicid = apicid;

#ifdef CONFIG_X86_32
/*
* Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y
* but we need to work other dependencies like SMP_SUSPEND etc
* before this can be done without some confusion.
* if (CPU_HOTPLUG_ENABLED || num_processors > 8)
* - Ashok Raj <ashok.raj@intel.com>
*/
if (max_physical_apicid >= 8) {
if (num_processors > 8) {
switch (boot_cpu_data.x86_vendor) {
case X86_VENDOR_INTEL:
if (!APIC_XAPIC(version)) {
Expand Down
8 changes: 3 additions & 5 deletions arch/x86/kernel/apic/probe_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,13 @@ void __init default_setup_apic_routing(void)
apic = &apic_x2apic_phys;
else
apic = &apic_x2apic_cluster;
printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);
}
#endif

if (apic == &apic_flat) {
if (max_physical_apicid >= 8)
if (apic == &apic_flat && num_processors > 8)
apic = &apic_physflat;
printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);
}

printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);

if (is_vsmp_box()) {
/* need to update phys_pkg_id */
Expand Down

0 comments on commit bb668da

Please sign in to comment.