Skip to content

Commit 7803339

Browse files
committed
KVM: selftests: Use data load to trigger LLC references/misses in Intel PMU
In the PMU counters test, add a data load in the measured loop and target the data with CLFLUSH{OPT} in order to (try to) guarantee the loop generates LLC misses and fills. Per the SDM, some hardware prefetchers are allowed to omit relevant PMU events, and Emerald Rapids (and possibly Sapphire Rapids) appears to have gained an instruction prefetcher that bypasses event counts. E.g. the test will consistently fail on EMR CPUs, but then pass with seemingly benign changes to the code. The event count includes speculation and cache line fills due to the first-level cache hardware prefetcher, but may exclude cache line fills due to other hardware-prefetchers. Generate a data load as a last ditch effort to preserve the (minimal) test coverage for LLC references and misses. Cc: Maxim Levitsky <mlevitsk@redhat.com> Link: https://lore.kernel.org/r/20241127235627.4049619-1-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent bd77910 commit 7803339

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

tools/testing/selftests/kvm/x86/pmu_counters_test.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* Number of instructions in each loop. 1 CLFLUSH/CLFLUSHOPT/NOP, 1 MFENCE,
1818
* 1 LOOP.
1919
*/
20-
#define NUM_INSNS_PER_LOOP 3
20+
#define NUM_INSNS_PER_LOOP 4
2121

2222
/*
2323
* Number of "extra" instructions that will be counted, i.e. the number of
@@ -162,13 +162,14 @@ do { \
162162
"1:\n\t" \
163163
clflush "\n\t" \
164164
"mfence\n\t" \
165+
"mov %[m], %%eax\n\t" \
165166
FEP "loop 1b\n\t" \
166167
FEP "mov %%edi, %%ecx\n\t" \
167168
FEP "xor %%eax, %%eax\n\t" \
168169
FEP "xor %%edx, %%edx\n\t" \
169170
"wrmsr\n\t" \
170171
:: "a"((uint32_t)_value), "d"(_value >> 32), \
171-
"c"(_msr), "D"(_msr) \
172+
"c"(_msr), "D"(_msr), [m]"m"(kvm_pmu_version) \
172173
); \
173174
} while (0)
174175

@@ -177,9 +178,9 @@ do { \
177178
wrmsr(_pmc_msr, 0); \
178179
\
179180
if (this_cpu_has(X86_FEATURE_CLFLUSHOPT)) \
180-
GUEST_MEASURE_EVENT(_ctrl_msr, _value, "clflushopt .", FEP); \
181+
GUEST_MEASURE_EVENT(_ctrl_msr, _value, "clflushopt %[m]", FEP); \
181182
else if (this_cpu_has(X86_FEATURE_CLFLUSH)) \
182-
GUEST_MEASURE_EVENT(_ctrl_msr, _value, "clflush .", FEP); \
183+
GUEST_MEASURE_EVENT(_ctrl_msr, _value, "clflush %[m]", FEP); \
183184
else \
184185
GUEST_MEASURE_EVENT(_ctrl_msr, _value, "nop", FEP); \
185186
\

0 commit comments

Comments
 (0)