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

Akihiko Odaki <[email protected]> Thu, 30 Jul 2026 14:44:22 +0900
Newsgroups dev.linux.lists.sashiko-reviews,dev.linux.lists.kvmarm,org.kernel.vger.kvm
Message-ID <[email protected]>
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.

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
>>