Re: [PATCH] KVM: selftests: fix steal_time for arm64 with host page size > 4K

Sean Christopherson <[email protected]>
Newsgroups dev.linux.lists.kvmarm,org.kernel.vger.kvm,org.kernel.vger.linux-kselftest
Message-ID <[email protected]>
On Mon, Jun 29, 2026, Sebastian Ott wrote:
> On Sun, 28 Jun 2026, Zenghui Yu wrote:
> 
> > On 6/22/26 10:14 PM, Sebastian Ott wrote:
> > > 
> > > Fix the following failure when running with 16K host page size:
> > > ==== Test Assertion Failure ====
> > >   lib/kvm_util.c:991: vm_adjust_num_guest_pages(vm->mode, npages) == npages
> > >   pid=873 tid=873 errno=0 - Success
> > >      1  0x0000000000405a27: vm_mem_add at kvm_util.c:991
> > >      2  0x000000000040241f: check_steal_time_uapi at steal_time.c:223 (discriminator 7)
> > >      3   (inlined by) main at steal_time.c:539 (discriminator 7)
> > >      4  0x00007fff8b57af3b: ?? ??:0
> > >      5  0x00007fff8b57b007: ?? ??:0
> > >      6  0x0000000000402b6f: _start at ??:?
> > >   Number of guest pages is not compatible with the host. Try npages=4
> > > 
> > > Fixes: fc240715fc50 ("KVM: selftests: arm64: Fix steal_time test after UAPI refactoring")
> > > Reported-by: Zenghui Yu <[email protected]>
> > > Link: https://lore.kernel.org/kvmarm/[email protected]/T/#u
> > > Signed-off-by: Sebastian Ott <[email protected]>
> > > ---
> > >  tools/testing/selftests/kvm/steal_time.c | 6 ++++--
> > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selftests/kvm/steal_time.c
> > > index 76fcdd1fd3cb..cdb81f3ee4b2 100644
> > > --- a/tools/testing/selftests/kvm/steal_time.c
> > > +++ b/tools/testing/selftests/kvm/steal_time.c
> > > @@ -208,6 +208,7 @@ static void check_steal_time_uapi(void)
> > >  {
> > >      struct kvm_vm *vm;
> > >      struct kvm_vcpu *vcpu;
> > > +    unsigned int gpages;
> > >      u64 st_ipa;
> > >      int ret;
> > > 
> > > @@ -220,8 +221,9 @@ static void check_steal_time_uapi(void)
> > >      };
> > > 
> > >      vcpu_ioctl(vcpu, KVM_HAS_DEVICE_ATTR, &dev);
> > > -    vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, ST_GPA_BASE, 1, 1, 0);
> > > -    virt_map(vm, ST_GPA_BASE, ST_GPA_BASE, 1);
> > > +    gpages = vm_calc_num_guest_pages(VM_MODE_DEFAULT, 1);
> > 
> > Would vm_calc_num_guest_pages(VM_MODE_DEFAULT, STEAL_TIME_SIZE) be better
> > to describe the number of pages we want to add?
> 
> Hm, I don't think we care. This is just for the uapi checker - the vm/vcpu
> doesn't even run..

Even though we don't truly care, we can "fix" that and dedup code at the same
time.  E.g.

diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selftests/kvm/steal_time.c
index bc3c62b72c58..c0256d4c4b09 100644
--- a/tools/testing/selftests/kvm/steal_time.c
+++ b/tools/testing/selftests/kvm/steal_time.c
@@ -27,6 +27,9 @@
 static void *st_gva[NR_VCPUS];
 static u64 guest_stolen_time[NR_VCPUS];
 
+static struct kvm_vm *vm_create_steal_time(u32 nr_vcpus, void *guest_code,
+                                          struct kvm_vcpu *vcpus[]);
+
 #if defined(__x86_64__)
 
 /* steal_time must have 64-byte alignment */
@@ -210,17 +213,14 @@ static void check_steal_time_uapi(void)
        u64 st_ipa;
        int ret;
 
-       vm = vm_create_with_one_vcpu(&vcpu, NULL);
-
        struct kvm_device_attr dev = {
                .group = KVM_ARM_VCPU_PVTIME_CTRL,
                .attr = KVM_ARM_VCPU_PVTIME_IPA,
                .addr = (u64)&st_ipa,
        };
 
+       vm = vm_create_steal_time(1, NULL, &vcpu);
        vcpu_ioctl(vcpu, KVM_HAS_DEVICE_ATTR, &dev);
-       vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, ST_GPA_BASE, 1, 1, 0);
-       virt_map(vm, ST_GPA_BASE, ST_GPA_BASE, 1);
 
        st_ipa = (ulong)ST_GPA_BASE | 1;
        ret = __vcpu_ioctl(vcpu, KVM_SET_DEVICE_ATTR, &dev);
@@ -500,13 +500,26 @@ static void run_vcpu(struct kvm_vcpu *vcpu)
        }
 }
 
+static struct kvm_vm *vm_create_steal_time(u32 nr_vcpus, void *guest_code,
+                                          struct kvm_vcpu *vcpus[])
+{
+       unsigned int gpages;
+       struct kvm_vm *vm;
+
+       vm = vm_create_with_vcpus(NR_VCPUS, guest_code, vcpus);
+       gpages = vm_calc_num_guest_pages(VM_MODE_DEFAULT, STEAL_TIME_SIZE * nr_vcpus);
+       vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, ST_GPA_BASE, 1, gpages, 0);
+       virt_map(vm, ST_GPA_BASE, ST_GPA_BASE, gpages);
+
+       return vm;
+}
+
 int main(int ac, char **av)
 {
        struct kvm_vcpu *vcpus[NR_VCPUS];
        struct kvm_vm *vm;
        pthread_t thread;
        cpu_set_t cpuset;
-       unsigned int gpages;
        long stolen_time;
        long run_delay;
        bool verbose;
@@ -518,10 +531,7 @@ int main(int ac, char **av)
        cpu = pin_self_to_any_cpu();
 
        /* Create a VM and an identity mapped memslot for the steal time structure */
-       vm = vm_create_with_vcpus(NR_VCPUS, guest_code, vcpus);
-       gpages = vm_calc_num_guest_pages(VM_MODE_DEFAULT, STEAL_TIME_SIZE * NR_VCPUS);
-       vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, ST_GPA_BASE, 1, gpages, 0);
-       virt_map(vm, ST_GPA_BASE, ST_GPA_BASE, gpages);
+       vm = vm_create_steal_time(NR_VCPUS, guest_code, vcpus);
 
        ksft_print_header();
        TEST_REQUIRE(is_steal_time_supported(vcpus[0]));
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.