From: Jinrong Liang <ljr.kernel@gmail.com>
To: Sean Christopherson <seanjc@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Jim Mattson <jmattson@google.com>, Shuah Khan <shuah@kernel.org>,
Aaron Lewis <aaronlewis@google.com>,
David Matlack <dmatlack@google.com>,
Vishal Annapurve <vannapurve@google.com>,
Wanpeng Li <wanpengli@tencent.com>,
Like Xu <like.xu.linux@gmail.com>,
Jinrong Liang <cloudliang@tencent.com>,
linux-kselftest@vger.kernel.org, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v3 3/4] KVM: selftests: Check if event filter meets expectations on fixed counters
Date: Wed, 7 Jun 2023 20:36:59 +0800 [thread overview]
Message-ID: <20230607123700.40229-4-cloudliang@tencent.com> (raw)
In-Reply-To: <20230607123700.40229-1-cloudliang@tencent.com>
From: Jinrong Liang <cloudliang@tencent.com>
Add tests to cover that pmu event_filter works as expected when
it's applied to fixed performance counters, even if there is none
fixed counter exists (e.g. Intel guest pmu version=1 or AMD guest).
Signed-off-by: Jinrong Liang <cloudliang@tencent.com>
---
.../kvm/x86_64/pmu_event_filter_test.c | 81 +++++++++++++++++++
1 file changed, 81 insertions(+)
diff --git a/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c b/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c
index 7555e0f4290c..72f7fdb821e5 100644
--- a/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c
+++ b/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c
@@ -824,6 +824,86 @@ static void test_filter_ioctl(struct kvm_vcpu *vcpu)
"Setting invalid or non-exist fixed cunters in the fixed bitmap fail.");
}
+static void intel_run_fixed_counter_guest_code(uint8_t fixed_ctr_idx)
+{
+ for (;;) {
+ wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0);
+ wrmsr(MSR_CORE_PERF_FIXED_CTR0 + fixed_ctr_idx, 0);
+
+ /* Only OS_EN bit is enabled for fixed counter[idx]. */
+ wrmsr(MSR_CORE_PERF_FIXED_CTR_CTRL, BIT_ULL(4 * fixed_ctr_idx));
+ wrmsr(MSR_CORE_PERF_GLOBAL_CTRL,
+ BIT_ULL(INTEL_PMC_IDX_FIXED + fixed_ctr_idx));
+ __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES}));
+ wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0);
+
+ GUEST_SYNC(rdmsr(MSR_CORE_PERF_FIXED_CTR0 + fixed_ctr_idx));
+ }
+}
+
+static uint64_t test_with_fixed_counter_filter(struct kvm_vcpu *vcpu,
+ uint32_t action, uint32_t bitmap)
+{
+ struct __kvm_pmu_event_filter f = {
+ .action = action,
+ .fixed_counter_bitmap = bitmap,
+ };
+ do_vcpu_set_pmu_event_filter(vcpu, &f);
+
+ return run_vcpu_to_sync(vcpu);
+}
+
+static void __test_fixed_counter_bitmap(struct kvm_vcpu *vcpu, uint8_t idx,
+ uint8_t nr_fixed_counters)
+{
+ unsigned int i;
+ uint32_t bitmap;
+ uint64_t count;
+
+ TEST_ASSERT(nr_fixed_counters < sizeof(bitmap),
+ "Invalid nr_fixed_counters");
+
+ /*
+ * Check the fixed performance counter can count normally works when
+ * KVM userspace doesn't set any pmu filter.
+ */
+ TEST_ASSERT(run_vcpu_to_sync(vcpu),
+ "Fixed counter does not exist or does not work as expected.");
+
+ for (i = 0; i < BIT(nr_fixed_counters); i++) {
+ bitmap = BIT(i);
+ count = test_with_fixed_counter_filter(vcpu, KVM_PMU_EVENT_ALLOW,
+ bitmap);
+ TEST_ASSERT(!!count == !!(bitmap & BIT(idx)),
+ "Fixed event filter does not work as expected.");
+
+ count = test_with_fixed_counter_filter(vcpu, KVM_PMU_EVENT_DENY,
+ bitmap);
+ TEST_ASSERT(!!count == !(bitmap & BIT(idx)),
+ "Fixed event filter does not work as expected.");
+ }
+}
+
+static void test_fixed_counter_bitmap(void)
+{
+ struct kvm_vm *vm;
+ struct kvm_vcpu *vcpu;
+ uint8_t idx;
+
+ /*
+ * Check that pmu_event_filter works as expected when it's applied to
+ * fixed performance counters.
+ */
+ for (idx = 0; idx < X86_INTEL_MAX_FIXED_CTR_NUM; idx++) {
+ vm = vm_create_with_one_vcpu(&vcpu,
+ intel_run_fixed_counter_guest_code);
+ vcpu_args_set(vcpu, 1, idx);
+ __test_fixed_counter_bitmap(vcpu, idx,
+ X86_INTEL_MAX_FIXED_CTR_NUM);
+ kvm_vm_free(vm);
+ }
+}
+
int main(int argc, char *argv[])
{
void (*guest_code)(void);
@@ -867,6 +947,7 @@ int main(int argc, char *argv[])
kvm_vm_free(vm);
test_pmu_config_disable(guest_code);
+ test_fixed_counter_bitmap();
return 0;
}
--
2.31.1
next prev parent reply other threads:[~2023-06-07 12:37 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-07 12:36 [PATCH v3 0/4] KVM: selftests: Improve PMU event filter settings and add test cases Jinrong Liang
2023-06-07 12:36 ` [PATCH v3 1/4] KVM: selftests: Introduce __kvm_pmu_event_filter to improved event filter settings Jinrong Liang
2023-06-28 21:19 ` Sean Christopherson
2023-06-30 2:47 ` Jinrong Liang
2023-06-07 12:36 ` [PATCH v3 2/4] KVM: selftests: Test unavailable event filters are rejected Jinrong Liang
2023-06-28 21:26 ` Sean Christopherson
2023-06-07 12:36 ` Jinrong Liang [this message]
2023-06-28 21:29 ` [PATCH v3 3/4] KVM: selftests: Check if event filter meets expectations on fixed counters Sean Christopherson
2023-06-07 12:37 ` [PATCH v3 4/4] KVM: selftests: Test gp event filters don't affect fixed event filters Jinrong Liang
2023-06-28 21:30 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230607123700.40229-4-cloudliang@tencent.com \
--to=ljr.kernel@gmail.com \
--cc=aaronlewis@google.com \
--cc=cloudliang@tencent.com \
--cc=dmatlack@google.com \
--cc=jmattson@google.com \
--cc=kvm@vger.kernel.org \
--cc=like.xu.linux@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=shuah@kernel.org \
--cc=vannapurve@google.com \
--cc=wanpengli@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.