]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/topology: Add paramter to split LLC
authorPeter Zijlstra <peterz@infradead.org>
Thu, 19 Feb 2026 11:11:16 +0000 (12:11 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 9 Apr 2026 13:49:46 +0000 (15:49 +0200)
Add a (debug) option to virtually split the LLC, no CAT involved, just fake
topology. Used to test code that depends (either in behaviour or directly) on
there being multiple LLC domains in a node.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Documentation/admin-guide/kernel-parameters.txt
arch/x86/include/asm/processor.h
arch/x86/kernel/smpboot.c

index 03a550630644f43d36b69ae79e6d66f42d75426d..a2161f683b2fa810224b4f73902f0fbf0ede936a 100644 (file)
@@ -7254,6 +7254,18 @@ Kernel parameters
                        Not specifying this option is equivalent to
                        spec_store_bypass_disable=auto.
 
+       split_llc=
+                       [X86,EARLY] Split the LLC N-ways
+
+                       When set, the LLC is split this many ways by matching
+                       'core_id % n'. This is setup before SMP bringup and
+                       used during SMP bringup before it knows the full
+                       topology. If your core count doesn't nicely divide by
+                       the number given, you get to keep the pieces.
+
+                       This is mostly a debug feature to emulate multiple LLCs
+                       on hardware that only have a single LLC.
+
        split_lock_detect=
                        [X86] Enable split lock detection or bus lock detection
 
index a24c7805acdb5c25051af30f305449f7f808834a..d0d7cefb6cd36a2b88a0c466e879052e8d757456 100644 (file)
@@ -699,6 +699,11 @@ static inline u32 per_cpu_l2c_id(unsigned int cpu)
        return per_cpu(cpu_info.topo.l2c_id, cpu);
 }
 
+static inline u32 per_cpu_core_id(unsigned int cpu)
+{
+       return per_cpu(cpu_info.topo.core_id, cpu);
+}
+
 #ifdef CONFIG_CPU_SUP_AMD
 /*
  * Issue a DIV 0/1 insn to clear any division data from previous DIV
index 294a8ea60298691bf3e48b36cd2372bde86697d0..cb999feb66b023c20a87851812297b530f8ffab3 100644 (file)
@@ -424,6 +424,21 @@ static const struct x86_cpu_id intel_cod_cpu[] = {
        {}
 };
 
+/*
+ * Allows splitting the LLC by matching 'core_id % split_llc'.
+ *
+ * This is mostly a debug hack to emulate systems with multiple LLCs per node
+ * on systems that do not naturally have this.
+ */
+static unsigned int split_llc = 0;
+
+static int __init split_llc_setup(char *str)
+{
+       get_option(&str, &split_llc);
+       return 0;
+}
+early_param("split_llc", split_llc_setup);
+
 static bool match_llc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
 {
        const struct x86_cpu_id *id = x86_match_cpu(intel_cod_cpu);
@@ -438,6 +453,11 @@ static bool match_llc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
        if (per_cpu_llc_id(cpu1) != per_cpu_llc_id(cpu2))
                return false;
 
+       if (split_llc &&
+           (per_cpu_core_id(cpu1) % split_llc) !=
+           (per_cpu_core_id(cpu2) % split_llc))
+               return false;
+
        /*
         * Allow the SNC topology without warning. Return of false
         * means 'c' does not share the LLC of 'o'. This will be