diff options
Diffstat (limited to 'tools/testing/selftests/kvm/lib/kvm_util.c')
| -rw-r--r-- | tools/testing/selftests/kvm/lib/kvm_util.c | 23 | 
1 files changed, 16 insertions, 7 deletions
| diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 74776ee228f2..3327cebc1095 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -14,6 +14,7 @@  #include <sys/mman.h>  #include <sys/types.h>  #include <sys/stat.h> +#include <unistd.h>  #include <linux/kernel.h>  #define KVM_UTIL_PGS_PER_HUGEPG 512 @@ -664,13 +665,21 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,  	/* As needed perform madvise */  	if (src_type == VM_MEM_SRC_ANONYMOUS || src_type == VM_MEM_SRC_ANONYMOUS_THP) { -		ret = madvise(region->host_mem, npages * vm->page_size, -			     src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE); -		TEST_ASSERT(ret == 0, "madvise failed,\n" -			    "  addr: %p\n" -			    "  length: 0x%lx\n" -			    "  src_type: %x", -			    region->host_mem, npages * vm->page_size, src_type); +		struct stat statbuf; + +		ret = stat("/sys/kernel/mm/transparent_hugepage", &statbuf); +		TEST_ASSERT(ret == 0 || (ret == -1 && errno == ENOENT), +			    "stat /sys/kernel/mm/transparent_hugepage"); + +		TEST_ASSERT(ret == 0 || src_type != VM_MEM_SRC_ANONYMOUS_THP, +			    "VM_MEM_SRC_ANONYMOUS_THP requires THP to be configured in the host kernel"); + +		if (ret == 0) { +			ret = madvise(region->host_mem, npages * vm->page_size, +				      src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE); +			TEST_ASSERT(ret == 0, "madvise failed, addr: %p length: 0x%lx src_type: %x", +				    region->host_mem, npages * vm->page_size, src_type); +		}  	}  	region->unused_phy_pages = sparsebit_alloc(); |