aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuresh Siddha <suresh.b.siddha@intel.com>2009-09-18 22:29:59 -0400
committerIngo Molnar <mingo@elte.hu>2009-09-19 03:20:05 -0400
commit2fbd07a5f5d1295fa9b0c0564ec27da7c276a75a (patch)
tree45fd32e811bd2c2cf5229bb71357d89c664033a9
parentdaf7b9c9216e2b82e4c14b7248a85286dab021c3 (diff)
x86, apic: Use logical flat on intel with <= 8 logical cpus
On Intel platforms, 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. Fix the relevant comments while we are at it. We can clean up default_setup_apic_routing() by using apic->probe() but that is a different item. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Cc: "yinghai@kernel.org" <yinghai@kernel.org> LKML-Reference: <1253327399.3948.747.camel@sbs-t61.sc.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/kernel/apic/apic.c26
-rw-r--r--arch/x86/kernel/apic/probe_64.c15
2 files changed, 19 insertions, 22 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 79e5b92a5800..072aea6c630b 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -61,7 +61,7 @@ unsigned int boot_cpu_physical_apicid = -1U;
61/* 61/*
62 * The highest APIC ID seen during enumeration. 62 * The highest APIC ID seen during enumeration.
63 * 63 *
64 * This determines the messaging protocol we can use: if all APIC IDs 64 * On AMD, this determines the messaging protocol we can use: if all APIC IDs
65 * are in the 0 ... 7 range, then we can use logical addressing which 65 * are in the 0 ... 7 range, then we can use logical addressing which
66 * has some performance advantages (better broadcasting). 66 * has some performance advantages (better broadcasting).
67 * 67 *
@@ -1915,24 +1915,14 @@ void __cpuinit generic_processor_info(int apicid, int version)
1915 max_physical_apicid = apicid; 1915 max_physical_apicid = apicid;
1916 1916
1917#ifdef CONFIG_X86_32 1917#ifdef CONFIG_X86_32
1918 /* 1918 switch (boot_cpu_data.x86_vendor) {
1919 * Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y 1919 case X86_VENDOR_INTEL:
1920 * but we need to work other dependencies like SMP_SUSPEND etc 1920 if (num_processors > 8)
1921 * before this can be done without some confusion. 1921 def_to_bigsmp = 1;
1922 * if (CPU_HOTPLUG_ENABLED || num_processors > 8) 1922 break;
1923 * - Ashok Raj <ashok.raj@intel.com> 1923 case X86_VENDOR_AMD:
1924 */ 1924 if (max_physical_apicid >= 8)
1925 if (max_physical_apicid >= 8) {
1926 switch (boot_cpu_data.x86_vendor) {
1927 case X86_VENDOR_INTEL:
1928 if (!APIC_XAPIC(version)) {
1929 def_to_bigsmp = 0;
1930 break;
1931 }
1932 /* If P4 and above fall through */
1933 case X86_VENDOR_AMD:
1934 def_to_bigsmp = 1; 1925 def_to_bigsmp = 1;
1935 }
1936 } 1926 }
1937#endif 1927#endif
1938 1928
diff --git a/arch/x86/kernel/apic/probe_64.c b/arch/x86/kernel/apic/probe_64.c
index 65edc180fc82..c4cbd3080c1c 100644
--- a/arch/x86/kernel/apic/probe_64.c
+++ b/arch/x86/kernel/apic/probe_64.c
@@ -64,16 +64,23 @@ void __init default_setup_apic_routing(void)
64 apic = &apic_x2apic_phys; 64 apic = &apic_x2apic_phys;
65 else 65 else
66 apic = &apic_x2apic_cluster; 66 apic = &apic_x2apic_cluster;
67 printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);
68 } 67 }
69#endif 68#endif
70 69
71 if (apic == &apic_flat) { 70 if (apic == &apic_flat) {
72 if (max_physical_apicid >= 8) 71 switch (boot_cpu_data.x86_vendor) {
73 apic = &apic_physflat; 72 case X86_VENDOR_INTEL:
74 printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); 73 if (num_processors > 8)
74 apic = &apic_physflat;
75 break;
76 case X86_VENDOR_AMD:
77 if (max_physical_apicid >= 8)
78 apic = &apic_physflat;
79 }
75 } 80 }
76 81
82 printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);
83
77 if (is_vsmp_box()) { 84 if (is_vsmp_box()) {
78 /* need to update phys_pkg_id */ 85 /* need to update phys_pkg_id */
79 apic->phys_pkg_id = apicid_phys_pkg_id; 86 apic->phys_pkg_id = apicid_phys_pkg_id;