]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86: fix intel x86_64 llc_shared_map/cpu_llc_id anomolies
authorSuresh Siddha <suresh.b.siddha@intel.com>
Fri, 19 Dec 2008 02:09:21 +0000 (18:09 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 18 Jan 2009 18:43:44 +0000 (10:43 -0800)
commit 345077cd98ff5532b2d1158013c3fec7b1ae85ec upstream.

Impact: fix wrong cache sharing detection on platforms supporting > 8 bit apicid's

In the presence of extended topology eumeration leaf 0xb provided
by cpuid, 32bit extended initial_apicid in cpuinfo_x86 struct will be
updated by detect_extended_topology(). At this instance, we should also
reinit the apicid (which could also potentially be extended to 32bit).

With out this there will potentially be duplicate apicid's populated in the
per cpu's cpuinfo_x86 struct, resulting in wrong cache sharing topology etc
detected by init_intel_cacheinfo().

Reported-by: Dimitri Sivanich <sivanich@sgi.com>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Acked-by: Dimitri Sivanich <sivanich@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kernel/cpu/addon_cpuid_features.c
arch/x86/kernel/cpu/intel.c

index ef8f831af823a89530297919585e50c9a691e804..2cf23634b6d94d60e239d3f63cd9d4d21526b3fd 100644 (file)
@@ -120,9 +120,17 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c)
        c->cpu_core_id = phys_pkg_id(c->initial_apicid, ht_mask_width)
                                                 & core_select_mask;
        c->phys_proc_id = phys_pkg_id(c->initial_apicid, core_plus_mask_width);
+       /*
+        * Reinit the apicid, now that we have extended initial_apicid.
+        */
+       c->apicid = phys_pkg_id(c->initial_apicid, 0);
 #else
        c->cpu_core_id = phys_pkg_id(ht_mask_width) & core_select_mask;
        c->phys_proc_id = phys_pkg_id(core_plus_mask_width);
+       /*
+        * Reinit the apicid, now that we have extended initial_apicid.
+        */
+       c->apicid = phys_pkg_id(0);
 #endif
        c->x86_max_cores = (core_level_siblings / smp_num_siblings);
 
index cce0b6118d550e015a34c5e1b0f9bc60de1f8b3d..57e3fbafb4f2506e4d2bb2570260d8bbd4cb96f7 100644 (file)
@@ -242,6 +242,13 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
 
        intel_workarounds(c);
 
+       /*
+        * Detect the extended topology information if available. This
+        * will reinitialise the initial_apicid which will be used
+        * in init_intel_cacheinfo()
+        */
+       detect_extended_topology(c);
+
        l2 = init_intel_cacheinfo(c);
        if (c->cpuid_level > 9) {
                unsigned eax = cpuid_eax(10);
@@ -313,7 +320,6 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
 
 #endif
 
-       detect_extended_topology(c);
        if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) {
                /*
                 * let's use the legacy cpuid vector 0x1 and 0x4 for topology