diff options
author | Suresh Siddha <suresh.b.siddha@intel.com> | 2009-09-18 22:29:59 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-09-19 03:20:05 -0400 |
commit | 2fbd07a5f5d1295fa9b0c0564ec27da7c276a75a (patch) | |
tree | 45fd32e811bd2c2cf5229bb71357d89c664033a9 /arch | |
parent | daf7b9c9216e2b82e4c14b7248a85286dab021c3 (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>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 26 | ||||
-rw-r--r-- | arch/x86/kernel/apic/probe_64.c | 15 |
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; |