Hi Shaoqin On Wed, Jun 19, 2024 at 1:32 AM Shaoqin Huang <shahuang@xxxxxxxxxx> 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@xxxxxxxxxx> > Signed-off-by: Shaoqin Huang <shahuang@xxxxxxxxxx> > --- > .../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@xxxxxxxxxx> - Raghavendra