Re: [PATCH v9 04/16] KVM: arm64: selftests: Test SET_NR_COUNTERS after first run

Fuad Tabba <[email protected]> Thu, 30 Jul 2026 08:15:05 +0100
Newsgroups dev.linux.lists.sashiko-reviews,dev.linux.lists.kvmarm,org.kernel.vger.kvm
Message-ID <CA+EHjTyhOqMti7q+OB8S7K-F48iMr9_FntAmW-jvfZmOC5JEHA@mail.gmail.com>
On Thu, 30 Jul 2026 at 06:44, Akihiko Odaki
<[email protected]> wrote:
>
> On 2026/07/30 0:23, Fuad Tabba wrote:
> > On Mon, 20 Jul 2026 at 07:09, <[email protected]> wrote:
> >>
> >> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> >> - [Medium] The test ignores the guest's exit state and `ucall` status after executing `vcpu_run()`.
> >
> > vcpu_run() does the check.
>
> vcpu_run() itself doesn't. run_vcpu() calls vcpu_run() and then performs
> the check (their names are so confusing here), but the new test bypasses
> run_vcpu() and therefore does not perform the check. I'm planning to
> rework the test to use run_vcpu() with the next version.

So Sashiko was right :) Fixing this would be good, thanks for pointing it out.

Cheers,
/fuad

>
> Regards,
> Akihiko Odaki
>
> >
> > /fuad
> >
> >> --
> >>
> >> --- Patch [4]: [PATCH v9 04/16] KVM: arm64: selftests: Test SET_NR_COUNTERS after first run ---
> >> commit 0382d3a32df9349f988ca69c7b11c92e61c3d384
> >> Author: Akihiko Odaki <[email protected]>
> >>
> >> KVM: arm64: selftests: Test SET_NR_COUNTERS after first run
> >>
> >> This commit adds a regression test that runs one vCPU and then tries to change
> >> the VM-scoped PMU counter count through an idle sibling to verify that
> >> SET_NR_COUNTERS fails with EBUSY once any vCPU has run.
> >>
> >>> diff --git a/tools/testing/selftests/kvm/arm64/vpmu_counter_access.c b/tools/testing/selftests/kvm/arm64/vpmu_counter_access.c
> >>> index 22223395969e0..3b5bb421f401b 100644
> >>> --- a/tools/testing/selftests/kvm/arm64/vpmu_counter_access.c
> >>> +++ b/tools/testing/selftests/kvm/arm64/vpmu_counter_access.c
> >>
> >> [ ... ]
> >>
> >>> @@ -622,6 +627,37 @@ static bool kvm_supports_nr_counters_attr(void)
> >>>        return supported;
> >>>   }
> >>>
> >>> +static void test_set_nr_counters_after_vcpu_run(void)
> >>> +{
> >>> +     struct kvm_vcpu *running_vcpu, *stopped_vcpu;
> >>> +     unsigned int nr_counters = 0;
> >>> +     struct kvm_vcpu_init init;
> >>> +     struct kvm_vm *vm;
> >>> +     int ret;
> >>> +     u64 irq = 23;
> >>> +
> >>> +     vm = vm_create(2);
> >>> +     vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init);
> >>> +     init.features[0] |= BIT(KVM_ARM_VCPU_PMU_V3);
> >>> +     running_vcpu = aarch64_vcpu_add(vm, 0, &init, guest_code_done);
> >>> +     stopped_vcpu = aarch64_vcpu_add(vm, 1, &init, guest_code_done);
> >>> +     kvm_arch_vm_finalize_vcpus(vm);
> >>> +
> >>> +     vcpu_device_attr_set(running_vcpu, KVM_ARM_VCPU_PMU_V3_CTRL,
> >>> +                          KVM_ARM_VCPU_PMU_V3_IRQ, &irq);
> >>> +     vcpu_device_attr_set(running_vcpu, KVM_ARM_VCPU_PMU_V3_CTRL,
> >>> +                          KVM_ARM_VCPU_PMU_V3_INIT, NULL);
> >>> +     vcpu_run(running_vcpu);
> >>
> >> [Severity: Medium]
> >> Does this code need to check the guest's exit state and ucall payload?
> >>
> >> If the guest payload crashes or hits an unexpected exception, this will silently
> >> ignore the failure and proceed. Since the test only checks for an EBUSY error on
> >> the subsequent ioctl (which will still be returned because the vCPU has been
> >> run), the test will pass despite the guest crash, potentially masking
> >> virtualization bugs.
> >>
> >>> +
> >>> +     ret = __vcpu_device_attr_set(stopped_vcpu, KVM_ARM_VCPU_PMU_V3_CTRL,
> >>> +                                  KVM_ARM_VCPU_PMU_V3_SET_NR_COUNTERS,
> >>> +                                  &nr_counters);
> >>> +     TEST_ASSERT(ret == -1 && errno == EBUSY,
> >>> +                 KVM_IOCTL_ERROR(KVM_SET_DEVICE_ATTR, ret));
> >>> +
> >>> +     kvm_vm_free(vm);
> >>> +}
> >>> +
> >>
> >> --
> >> Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=4
> >>
>