Hi, Shuah, Any comment on this series? Thanks, don On 4/24/2024 3:44 PM, Dongsheng Zhang wrote: > From: donsheng <dongsheng.x.zhang@xxxxxxxxx> > > If the host was booted with the "default_hugepagesz=1G" kernel command-line > parameter, running the NX hugepage test will fail with error "Invalid argument" > at the TEST_ASSERT line in kvm_util.c's __vm_mem_region_delete() function: > static void __vm_mem_region_delete(struct kvm_vm *vm, > struct userspace_mem_region *region, > bool unlink) > { > int ret; > ... > ret = munmap(region->mmap_start, region->mmap_size); > TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); > ... > } > > NX hugepage test creates a VM with a data slot of 6M size backed with huge > pages. If the default hugetlb page size is set to 1G, calling mmap() with > MAP_HUGETLB and a length of 6M will succeed but calling its matching munmap() > will fail. Documentation/admin-guide/mm/hugetlbpage.rst specifies this behavior: > > "Syscalls that operate on memory backed by hugetlb pages only have their lengths > aligned to the native page size of the processor; they will normally fail with > errno set to EINVAL or exclude hugetlb pages that extend beyond the length if > not hugepage aligned. For example, munmap(2) will fail if memory is backed by > a hugetlb page and the length is smaller than the hugepage size." > > Explicitly use MAP_HUGE_2MB in conjunction with MAP_HUGETLB to fix the issue. > > Signed-off-by: donsheng <dongsheng.x.zhang@xxxxxxxxx> > Suggested-by: Zide Chen <zide.chen@xxxxxxxxx> > --- > tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c b/tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c > index 17bbb96fc4df..146e9033e206 100644 > --- a/tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c > +++ b/tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c > @@ -129,7 +129,7 @@ void run_test(int reclaim_period_ms, bool disable_nx_huge_pages, > > vcpu = vm_vcpu_add(vm, 0, guest_code); > > - vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS_HUGETLB, > + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS_HUGETLB_2MB, > HPAGE_GPA, HPAGE_SLOT, > HPAGE_SLOT_NPAGES, 0); >