x86/topology: Add paramter to split LLC

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>
This commit is contained in:
Peter Zijlstra 2026-02-19 12:11:16 +01:00
parent 985215804d
commit abb12b9b52
3 changed files with 37 additions and 0 deletions

View 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

View 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

View 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