History

KVM: selftests: Don't require THP to run tests

Unless we want to test with THP, then we shouldn't require it to be configured by the host kernel. Unfortunately, even advising with MADV_NOHUGEPAGE does require it, so check for THP first in order to avoid madvise failing with EINVAL.

Andrew Jones committed 6 years ago

Commit 0f55b671 parent 064eedf1 file · +16 −7Browse files

Unified · Split

tools/testing/selftests/kvm/lib/kvm_util.c+16−7
@@ -14,6 +14,7 @@ · 13 unmodified lines
14#include <sys/mman.h>14#include <sys/mman.h>
15#include <sys/types.h>15#include <sys/types.h>
16#include <sys/stat.h>16#include <sys/stat.h>
17#include <unistd.h>
17#include <linux/kernel.h>18#include <linux/kernel.h>
18 19
19#define KVM_UTIL_PGS_PER_HUGEPG 51220#define KVM_UTIL_PGS_PER_HUGEPG 512
@@ -664,13 +665,21 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, · 644 unmodified lines
664 665
665 /* As needed perform madvise */666 /* As needed perform madvise */
666 if (src_type == VM_MEM_SRC_ANONYMOUS || src_type == VM_MEM_SRC_ANONYMOUS_THP) {667 if (src_type == VM_MEM_SRC_ANONYMOUS || src_type == VM_MEM_SRC_ANONYMOUS_THP) {
667 ret = madvise(region->host_mem, npages * vm->page_size,668 struct stat statbuf;
668 src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE);669
669 TEST_ASSERT(ret == 0, "madvise failed,\n"670 ret = stat("/sys/kernel/mm/transparent_hugepage", &statbuf);
670 " addr: %p\n"671 TEST_ASSERT(ret == 0 || (ret == -1 && errno == ENOENT),
671 " length: 0x%lx\n"672 "stat /sys/kernel/mm/transparent_hugepage");
672 " src_type: %x",673
673 region->host_mem, npages * vm->page_size, src_type);674 TEST_ASSERT(ret == 0 || src_type != VM_MEM_SRC_ANONYMOUS_THP,
675 "VM_MEM_SRC_ANONYMOUS_THP requires THP to be configured in the host kernel");
676
677 if (ret == 0) {
678 ret = madvise(region->host_mem, npages * vm->page_size,
679 src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE);
680 TEST_ASSERT(ret == 0, "madvise failed, addr: %p length: 0x%lx src_type: %x",
681 region->host_mem, npages * vm->page_size, src_type);
682 }
674 }683 }
675 684
676 region->unused_phy_pages = sparsebit_alloc();685 region->unused_phy_pages = sparsebit_alloc();