Revert "x86, apic: Use logical flat on intel with <= 8 logical cpus"
authorAnanth N Mavinakayanahalli <ananth@in.ibm.com>
Mon, 11 Jan 2010 23:51:04 +0000 (15:51 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 12 Jan 2010 00:47:57 +0000 (16:47 -0800)
Revert commit 2fbd07a5f5d1295fa9b0c0564ec27da7c276a75a, as this commit
breaks an IBM platform with quad-core Xeon cpu's.

According to Suresh, this might be an IBM platform issue, as on other
Intel platforms with <= 8 logical cpu's, logical flat mode works fine
irespective of physical apic id values (inline with the xapic
architecture).

Revert this for now because of the IBM platform breakage.

Another version will be re-submitted after the complete analysis.

Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Acked-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/kernel/apic/apic.c
arch/x86/kernel/apic/probe_64.c

index aa57c079c98f6c345e91313e37f3f52e8d3f26bb..e80f291472a4158535e44ed9afac24f8400453b8 100644 (file)
@@ -62,7 +62,7 @@ unsigned int boot_cpu_physical_apicid = -1U;
 /*
  * The highest APIC ID seen during enumeration.
  *
- * On AMD, this determines the messaging protocol we can use: if all APIC IDs
+ * 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).
  *
@@ -1898,14 +1898,24 @@ void __cpuinit generic_processor_info(int apicid, int version)
                max_physical_apicid = apicid;
 
 #ifdef CONFIG_X86_32
-       switch (boot_cpu_data.x86_vendor) {
-       case X86_VENDOR_INTEL:
-               if (num_processors > 8)
-                       def_to_bigsmp = 1;
-               break;
-       case X86_VENDOR_AMD:
-               if (max_physical_apicid >= 8)
+       /*
+        * 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) {
+               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;
+               }
        }
 #endif
 
index c4cbd3080c1c36e0c798d10a4652427fa4e09603..65edc180fc8297be82347bec05e3cd62d155a86d 100644 (file)
@@ -64,23 +64,16 @@ 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) {
-               switch (boot_cpu_data.x86_vendor) {
-               case X86_VENDOR_INTEL:
-                       if (num_processors > 8)
-                               apic = &apic_physflat;
-                       break;
-               case X86_VENDOR_AMD:
-                       if (max_physical_apicid >= 8)
-                               apic = &apic_physflat;
-               }
+               if (max_physical_apicid >= 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 */
                apic->phys_pkg_id = apicid_phys_pkg_id;