]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/cacheinfo: Extract out cache level topology ID calculation
authorAhmed S. Darwish <darwi@linutronix.de>
Mon, 24 Mar 2025 13:33:20 +0000 (14:33 +0100)
committerIngo Molnar <mingo@kernel.org>
Tue, 25 Mar 2025 09:23:21 +0000 (10:23 +0100)
For Intel CPUID leaf 0x4 parsing, refactor the cache level topology ID
calculation code into its own method instead of repeating the same logic
twice for L2 and L3.

Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/r/20250324133324.23458-26-darwi@linutronix.de
arch/x86/kernel/cpu/cacheinfo.c

index 72cc32d22c4d4d836ea614e444f7cb45cba1ee87..7b274da7c725bd196fbcc8968c86ae46a56f0273 100644 (file)
@@ -400,6 +400,16 @@ static void intel_cacheinfo_0x2(struct cpuinfo_x86 *c)
        intel_cacheinfo_done(c, l3, l2, l1i, l1d);
 }
 
+static unsigned int calc_cache_topo_id(struct cpuinfo_x86 *c, const struct _cpuid4_info *id4)
+{
+       unsigned int num_threads_sharing;
+       int index_msb;
+
+       num_threads_sharing = 1 + id4->eax.split.num_threads_sharing;
+       index_msb = get_count_order(num_threads_sharing);
+       return c->topo.apicid & ~((1 << index_msb) - 1);
+}
+
 static bool intel_cacheinfo_0x4(struct cpuinfo_x86 *c)
 {
        struct cpu_cacheinfo *ci = get_cpu_cacheinfo(c->cpu_index);
@@ -420,7 +430,6 @@ static bool intel_cacheinfo_0x4(struct cpuinfo_x86 *c)
                return false;
 
        for (int i = 0; i < ci->num_leaves; i++) {
-               unsigned int num_threads_sharing, index_msb;
                struct _cpuid4_info id4 = {};
                int ret;
 
@@ -437,15 +446,11 @@ static bool intel_cacheinfo_0x4(struct cpuinfo_x86 *c)
                        break;
                case 2:
                        l2 = id4.size / 1024;
-                       num_threads_sharing = 1 + id4.eax.split.num_threads_sharing;
-                       index_msb = get_count_order(num_threads_sharing);
-                       l2_id = c->topo.apicid & ~((1 << index_msb) - 1);
+                       l2_id = calc_cache_topo_id(c, &id4);
                        break;
                case 3:
                        l3 = id4.size / 1024;
-                       num_threads_sharing = 1 + id4.eax.split.num_threads_sharing;
-                       index_msb = get_count_order(num_threads_sharing);
-                       l3_id = c->topo.apicid & ~((1 << index_msb) - 1);
+                       l3_id = calc_cache_topo_id(c, &id4);
                        break;
                default:
                        break;