Message ID | 20240619083200.1047073-2-shahuang@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: selftests: aarch64: Introduce pmu_event_filter_test | expand |
Hi Shaoqin On Wed, Jun 19, 2024 at 1:32 AM Shaoqin Huang <shahuang@redhat.com> wrote: > > Create a vcpu with vpmu would be a common requirement for the vpmu test, > so add the helper function for the vpmu vcpu creation. And use those > helper function in the vpmu_counter_access.c test. > > Use this chance to delete the meaningless ASSERT about the pmuver, > because KVM does not advertise an IMP_DEF PMU to guests. > > No functional changes intended. > > Reviewed-by: Eric Auger <eric.auger@redhat.com> > Signed-off-by: Shaoqin Huang <shahuang@redhat.com> > --- > .../kvm/aarch64/vpmu_counter_access.c | 32 ++++--------------- > .../selftests/kvm/include/aarch64/vpmu.h | 28 ++++++++++++++++ > 2 files changed, 34 insertions(+), 26 deletions(-) > create mode 100644 tools/testing/selftests/kvm/include/aarch64/vpmu.h > > diff --git a/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c b/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c > index d31b9f64ba14..68da44198719 100644 > --- a/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c > +++ b/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c > @@ -16,6 +16,7 @@ > #include <processor.h> > #include <test_util.h> > #include <vgic.h> > +#include <vpmu.h> > #include <perf/arm_pmuv3.h> > #include <linux/bitfield.h> > > @@ -407,18 +408,8 @@ static void guest_code(uint64_t expected_pmcr_n) > /* Create a VM that has one vCPU with PMUv3 configured. */ > static void create_vpmu_vm(void *guest_code) > { > - struct kvm_vcpu_init init; > - uint8_t pmuver, ec; > - uint64_t dfr0, irq = 23; > - struct kvm_device_attr irq_attr = { > - .group = KVM_ARM_VCPU_PMU_V3_CTRL, > - .attr = KVM_ARM_VCPU_PMU_V3_IRQ, > - .addr = (uint64_t)&irq, > - }; > - struct kvm_device_attr init_attr = { > - .group = KVM_ARM_VCPU_PMU_V3_CTRL, > - .attr = KVM_ARM_VCPU_PMU_V3_INIT, > - }; > + uint8_t ec; > + uint64_t irq = 23; > > /* The test creates the vpmu_vm multiple times. Ensure a clean state */ > memset(&vpmu_vm, 0, sizeof(vpmu_vm)); > @@ -430,26 +421,15 @@ static void create_vpmu_vm(void *guest_code) > guest_sync_handler); > } > > - /* Create vCPU with PMUv3 */ > - vm_ioctl(vpmu_vm.vm, KVM_ARM_PREFERRED_TARGET, &init); > - init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3); > - vpmu_vm.vcpu = aarch64_vcpu_add(vpmu_vm.vm, 0, &init, guest_code); > + vpmu_vm.vcpu = vm_vcpu_add_with_vpmu(vpmu_vm.vm, 0, guest_code); > vcpu_init_descriptor_tables(vpmu_vm.vcpu); > vpmu_vm.gic_fd = vgic_v3_setup(vpmu_vm.vm, 1, 64); > __TEST_REQUIRE(vpmu_vm.gic_fd >= 0, > "Failed to create vgic-v3, skipping"); > > - /* Make sure that PMUv3 support is indicated in the ID register */ > - vcpu_get_reg(vpmu_vm.vcpu, > - KVM_ARM64_SYS_REG(SYS_ID_AA64DFR0_EL1), &dfr0); > - pmuver = FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer), dfr0); > - TEST_ASSERT(pmuver != ID_AA64DFR0_EL1_PMUVer_IMP_DEF && > - pmuver >= ID_AA64DFR0_EL1_PMUVer_IMP, > - "Unexpected PMUVER (0x%x) on the vCPU with PMUv3", pmuver); > - > /* Initialize vPMU */ > - vcpu_ioctl(vpmu_vm.vcpu, KVM_SET_DEVICE_ATTR, &irq_attr); > - vcpu_ioctl(vpmu_vm.vcpu, KVM_SET_DEVICE_ATTR, &init_attr); > + vpmu_set_irq(vpmu_vm.vcpu, irq); > + vpmu_init(vpmu_vm.vcpu); > } > > static void destroy_vpmu_vm(void) > diff --git a/tools/testing/selftests/kvm/include/aarch64/vpmu.h b/tools/testing/selftests/kvm/include/aarch64/vpmu.h > new file mode 100644 > index 000000000000..5ef6cb011e41 > --- /dev/null > +++ b/tools/testing/selftests/kvm/include/aarch64/vpmu.h > @@ -0,0 +1,28 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > + > +#include <kvm_util.h> > + > +static inline struct kvm_vcpu *vm_vcpu_add_with_vpmu(struct kvm_vm *vm, > + uint32_t vcpu_id, > + void *guest_code) > +{ > + struct kvm_vcpu_init init; > + > + /* Create vCPU with PMUv3 */ > + vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); > + init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3); > + > + return aarch64_vcpu_add(vm, 0, &init, guest_code); > +} > + > +static void vpmu_set_irq(struct kvm_vcpu *vcpu, int irq) > +{ > + kvm_device_attr_set(vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, > + KVM_ARM_VCPU_PMU_V3_IRQ, &irq); > +} > + > +static void vpmu_init(struct kvm_vcpu *vcpu) > +{ > + kvm_device_attr_set(vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, > + KVM_ARM_VCPU_PMU_V3_INIT, NULL); > +} > -- > 2.40.1 > > Reviewed-by: Raghavendra Rao Ananta <rananta@google.com> - Raghavendra
diff --git a/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c b/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c index d31b9f64ba14..68da44198719 100644 --- a/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c +++ b/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c @@ -16,6 +16,7 @@ #include <processor.h> #include <test_util.h> #include <vgic.h> +#include <vpmu.h> #include <perf/arm_pmuv3.h> #include <linux/bitfield.h> @@ -407,18 +408,8 @@ static void guest_code(uint64_t expected_pmcr_n) /* Create a VM that has one vCPU with PMUv3 configured. */ static void create_vpmu_vm(void *guest_code) { - struct kvm_vcpu_init init; - uint8_t pmuver, ec; - uint64_t dfr0, irq = 23; - struct kvm_device_attr irq_attr = { - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .attr = KVM_ARM_VCPU_PMU_V3_IRQ, - .addr = (uint64_t)&irq, - }; - struct kvm_device_attr init_attr = { - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .attr = KVM_ARM_VCPU_PMU_V3_INIT, - }; + uint8_t ec; + uint64_t irq = 23; /* The test creates the vpmu_vm multiple times. Ensure a clean state */ memset(&vpmu_vm, 0, sizeof(vpmu_vm)); @@ -430,26 +421,15 @@ static void create_vpmu_vm(void *guest_code) guest_sync_handler); } - /* Create vCPU with PMUv3 */ - vm_ioctl(vpmu_vm.vm, KVM_ARM_PREFERRED_TARGET, &init); - init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3); - vpmu_vm.vcpu = aarch64_vcpu_add(vpmu_vm.vm, 0, &init, guest_code); + vpmu_vm.vcpu = vm_vcpu_add_with_vpmu(vpmu_vm.vm, 0, guest_code); vcpu_init_descriptor_tables(vpmu_vm.vcpu); vpmu_vm.gic_fd = vgic_v3_setup(vpmu_vm.vm, 1, 64); __TEST_REQUIRE(vpmu_vm.gic_fd >= 0, "Failed to create vgic-v3, skipping"); - /* Make sure that PMUv3 support is indicated in the ID register */ - vcpu_get_reg(vpmu_vm.vcpu, - KVM_ARM64_SYS_REG(SYS_ID_AA64DFR0_EL1), &dfr0); - pmuver = FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer), dfr0); - TEST_ASSERT(pmuver != ID_AA64DFR0_EL1_PMUVer_IMP_DEF && - pmuver >= ID_AA64DFR0_EL1_PMUVer_IMP, - "Unexpected PMUVER (0x%x) on the vCPU with PMUv3", pmuver); - /* Initialize vPMU */ - vcpu_ioctl(vpmu_vm.vcpu, KVM_SET_DEVICE_ATTR, &irq_attr); - vcpu_ioctl(vpmu_vm.vcpu, KVM_SET_DEVICE_ATTR, &init_attr); + vpmu_set_irq(vpmu_vm.vcpu, irq); + vpmu_init(vpmu_vm.vcpu); } static void destroy_vpmu_vm(void) diff --git a/tools/testing/selftests/kvm/include/aarch64/vpmu.h b/tools/testing/selftests/kvm/include/aarch64/vpmu.h new file mode 100644 index 000000000000..5ef6cb011e41 --- /dev/null +++ b/tools/testing/selftests/kvm/include/aarch64/vpmu.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include <kvm_util.h> + +static inline struct kvm_vcpu *vm_vcpu_add_with_vpmu(struct kvm_vm *vm, + uint32_t vcpu_id, + void *guest_code) +{ + struct kvm_vcpu_init init; + + /* Create vCPU with PMUv3 */ + vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); + init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3); + + return aarch64_vcpu_add(vm, 0, &init, guest_code); +} + +static void vpmu_set_irq(struct kvm_vcpu *vcpu, int irq) +{ + kvm_device_attr_set(vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, + KVM_ARM_VCPU_PMU_V3_IRQ, &irq); +} + +static void vpmu_init(struct kvm_vcpu *vcpu) +{ + kvm_device_attr_set(vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, + KVM_ARM_VCPU_PMU_V3_INIT, NULL); +}