diff mbox series

[1/2] KVM: selftests: Fix nx_huge_pages_test for default_hugepagesz=1G

Message ID 20240424224434.14166-1-dongsheng.x.zhang@intel.com (mailing list archive)
State New
Headers show
Series [1/2] KVM: selftests: Fix nx_huge_pages_test for default_hugepagesz=1G | expand

Commit Message

Zhang, Dongsheng X April 24, 2024, 10:44 p.m. UTC
From: donsheng <dongsheng.x.zhang@intel.com>

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@intel.com>
Suggested-by: Zide Chen <zide.chen@intel.com>
---
 tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Zhang, Dongsheng X May 21, 2024, 8:51 p.m. UTC | #1
Hi, Shuah,
Any comment on this series?

Thanks,
don

On 4/24/2024 3:44 PM, Dongsheng Zhang wrote:
> From: donsheng <dongsheng.x.zhang@intel.com>
> 
> 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@intel.com>
> Suggested-by: Zide Chen <zide.chen@intel.com>
> ---
>  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);
>
diff mbox series

Patch

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