Re: [PATCH v2 2/3] KVM: selftests: arm64: Skip sea_to_user without 1GB hugepages
Jiaqi Yan <[email protected]>
| Newsgroups | dev.linux.lists.kvmarm,org.kernel.vger.kvm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CACw3F51WrQ=5=DaKChPtwmf0030R3GSOPjrAZ9Og+V0VHuRhEw@mail.gmail.com> |
On Tue, Aug 18, 2026 at 4:29 AM Like Xu <[email protected]> wrote: > > sea_to_user backs guest memory with 1GB hugepages but never checks that > any are reserved. On a host with an empty pool it aborts instead of > skipping: > > kvm_syscalls.h:68: mem != MAP_FAILED, errno=12 (ENOMEM) > not ok 1 selftests: kvm: sea_to_user # exit=254 > > The mmap() of the hugetlb region fails with -ENOMEM because no 1GB pages > are available, and the test treats that as a hard failure even though it > simply cannot run without the backing pages. Check the free 1GB hugepage > count up front and skip cleanly when the host cannot satisfy the region. Looks good to me, just one nit below. Reviewed-by: Jiaqi Yan <[email protected]> > > Signed-off-by: Like Xu <[email protected]> > --- > tools/testing/selftests/kvm/arm64/sea_to_user.c | 6 ++++++ > tools/testing/selftests/kvm/include/test_util.h | 1 + > tools/testing/selftests/kvm/lib/test_util.c | 15 +++++++++++++++ > 3 files changed, 22 insertions(+) > > diff --git a/tools/testing/selftests/kvm/arm64/sea_to_user.c b/tools/testing/selftests/kvm/arm64/sea_to_user.c > index 1c2a743ca8e23..7cf95da8e594d 100644 > --- a/tools/testing/selftests/kvm/arm64/sea_to_user.c > +++ b/tools/testing/selftests/kvm/arm64/sea_to_user.c > @@ -281,6 +281,12 @@ static struct kvm_vm *vm_create_with_sea_handler(struct kvm_vcpu **vcpu) > alignment = max(backing_page_size, guest_page_size); > num_guest_pages = VM_MEM_SIZE / guest_page_size; > > + /* > + * The region is backed by 1GB hugepages; skip gracefully rather than > + * failing with mmap() -ENOMEM if the host has none reserved. > + */ > + TEST_REQUIRE(get_free_hugepages(backing_page_size) >= VM_MEM_SIZE); How about moving the src_type to main or global? Then we can TEST_REQUIRE() in main(). > + > vm = __vm_create_with_one_vcpu(vcpu, num_guest_pages, guest_code); > vm_init_descriptor_tables(vm); > vcpu_init_descriptor_tables(*vcpu); > diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h > index a56271c237ae9..0624922c2735d 100644 > --- a/tools/testing/selftests/kvm/include/test_util.h > +++ b/tools/testing/selftests/kvm/include/test_util.h > @@ -168,6 +168,7 @@ struct vm_mem_backing_src_alias { > bool thp_configured(void); > size_t get_trans_hugepagesz(void); > size_t get_def_hugetlb_pagesz(void); > +size_t get_free_hugepages(size_t page_size); > const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(u32 i); > size_t get_backing_src_pagesz(u32 i); > bool is_backing_src_hugetlb(u32 i); > diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c > index bab1bd2b775b6..29f9c1d60b1b7 100644 > --- a/tools/testing/selftests/kvm/lib/test_util.c > +++ b/tools/testing/selftests/kvm/lib/test_util.c > @@ -222,6 +222,21 @@ size_t get_def_hugetlb_pagesz(void) > TEST_FAIL("Error in reading /proc/meminfo"); > } > > +size_t get_free_hugepages(size_t page_size) > +{ > + char path[128]; > + size_t free; > + > + snprintf(path, sizeof(path), > + "/sys/kernel/mm/hugepages/hugepages-%zukB/free_hugepages", > + page_size >> 10); > + if (!test_sysfs_path(path)) > + return 0; > + > + free = get_sysfs_val(path); > + return free * page_size; > +} > + > #define ANON_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS) > #define ANON_HUGE_FLAGS (ANON_FLAGS | MAP_HUGETLB) > > -- > 2.50.1 (Apple Git-155) >