mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
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:
parent
985215804d
commit
abb12b9b52
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user