Re: [PATCH v2 2/3] KVM: selftests: arm64: Skip sea_to_user without 1GB hugepages
From: Jiaqi Yan
Date: Sun Aug 23 2026 - 14:43:04 EST
On Tue, Aug 18, 2026 at 4:29 AM Like Xu <like.xu.linux@xxxxxxxxx> 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 <jiaqiyan@xxxxxxxxxx>
>
> Signed-off-by: Like Xu <likexu@xxxxxxxxxxx>
> ---
> 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)
>