On Tue, Oct 24, 2023, JinrongLiang wrote: > 在 2023/10/24 08:26, Sean Christopherson 写道: > > From: Jinrong Liang <cloudliang@xxxxxxxxxxx> > > > > Extend the PMU counters test to verify KVM emulation of fixed counters in > > addition to general purpose counters. Fixed counters add an extra wrinkle > > in the form of an extra supported bitmask. Thus quoth the SDM: > > > > fixed-function performance counter 'i' is supported if ECX[i] || (EDX[4:0] > i) > > > > Test that KVM handles a counter being available through either method. > > > > Co-developed-by: Like Xu <likexu@xxxxxxxxxxx> > > Signed-off-by: Like Xu <likexu@xxxxxxxxxxx> > > Signed-off-by: Jinrong Liang <cloudliang@xxxxxxxxxxx> > > Co-developed-by: Sean Christopherson <seanjc@xxxxxxxxxx> > > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > > --- > > .../selftests/kvm/x86_64/pmu_counters_test.c | 58 ++++++++++++++++++- > > 1 file changed, 55 insertions(+), 3 deletions(-) > > > > diff --git a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c > > index 274b7f4d4b53..f1d9cdd69a17 100644 > > --- a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c > > +++ b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c > > @@ -227,13 +227,19 @@ __GUEST_ASSERT(expect_gp ? vector == GP_VECTOR : !vector, \ > > expect_gp ? "#GP" : "no fault", msr, vector) \ > > static void guest_rd_wr_counters(uint32_t base_msr, uint8_t nr_possible_counters, > > - uint8_t nr_counters) > > + uint8_t nr_counters, uint32_t or_mask) > > { > > uint8_t i; > > for (i = 0; i < nr_possible_counters; i++) { > > const uint32_t msr = base_msr + i; > > - const bool expect_success = i < nr_counters; > > + > > + /* > > + * Fixed counters are supported if the counter is less than the > > + * number of enumerated contiguous counters *or* the counter is > > + * explicitly enumerated in the supported counters mask. > > + */ > > + const bool expect_success = i < nr_counters || (or_mask & BIT(i)); > > /* > > * KVM drops writes to MSR_P6_PERFCTR[0|1] if the counters are > > @@ -273,7 +279,7 @@ static void guest_test_gp_counters(void) > > else > > base_msr = MSR_IA32_PERFCTR0; > > - guest_rd_wr_counters(base_msr, MAX_NR_GP_COUNTERS, nr_gp_counters); > > + guest_rd_wr_counters(base_msr, MAX_NR_GP_COUNTERS, nr_gp_counters, 0); > > } > > static void test_gp_counters(uint8_t nr_gp_counters, uint64_t perf_cap) > > @@ -292,10 +298,51 @@ static void test_gp_counters(uint8_t nr_gp_counters, uint64_t perf_cap) > > kvm_vm_free(vm); > > } > > +static void guest_test_fixed_counters(void) > > +{ > > + uint64_t supported_bitmask = 0; > > + uint8_t nr_fixed_counters = 0; > > + > > + /* KVM provides fixed counters iff the vPMU version is 2+. */ > > s/iff/if/ The "iff" is intentional, it's shorthand for "if and only if". Ha, it even has a Wikipedia page: https://en.wikipedia.org/wiki/If_and_only_if.