On Wed, May 12, 2021 at 2:45 PM Axel Rasmussen axelrasmussen@google.com wrote:
This lets us run the demand paging test on top of a shared hugetlbfs-backed area. The "shared" is key, as this allows us to exercise userfaultfd minor faults on hugetlbfs.
Signed-off-by: Axel Rasmussen axelrasmussen@google.com
tools/testing/selftests/kvm/demand_paging_test.c | 6 ++++-- tools/testing/selftests/kvm/include/test_util.h | 10 ++++++++++ tools/testing/selftests/kvm/lib/kvm_util.c | 9 +++++++-- tools/testing/selftests/kvm/lib/test_util.c | 6 ++++++ 4 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c index ff29aaea3120..32942c9e0376 100644 --- a/tools/testing/selftests/kvm/demand_paging_test.c +++ b/tools/testing/selftests/kvm/demand_paging_test.c @@ -502,8 +502,10 @@ int main(int argc, char *argv[]) } }
TEST_ASSERT(p.uffd_mode != UFFDIO_REGISTER_MODE_MINOR || p.src_type == VM_MEM_SRC_SHMEM,
"userfaultfd MINOR mode requires shared memory; pick a different -t");
if (p.uffd_mode == UFFDIO_REGISTER_MODE_MINOR &&
!backing_src_is_shared(p.src_type)) {
TEST_FAIL("userfaultfd MINOR mode requires shared memory; pick a different -t");
} for_each_guest_mode(run_test, &p);
diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h index 7377f00469ef..852d6d2cc285 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -85,9 +85,19 @@ enum vm_mem_backing_src_type { VM_MEM_SRC_ANONYMOUS_HUGETLB_2GB, VM_MEM_SRC_ANONYMOUS_HUGETLB_16GB, VM_MEM_SRC_SHMEM,
VM_MEM_SRC_SHARED_HUGETLB, NUM_SRC_TYPES,
};
+/*
- Whether or not the given source type is shared memory (as opposed to
- anonymous).
- */
+static inline bool backing_src_is_shared(enum vm_mem_backing_src_type t) +{
return t == VM_MEM_SRC_SHMEM || t == VM_MEM_SRC_SHARED_HUGETLB;
+}
Would it make sense to check (vm_mem_backing_src_alias(t)->flag & MAP_SHARED) == MAP_SHARED instead?
struct vm_mem_backing_src_alias { const char *name; uint32_t flag; diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 838d58633f7e..fed02153c919 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -756,8 +756,13 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, region->mmap_size += alignment;
region->fd = -1;
if (src_type == VM_MEM_SRC_SHMEM) {
region->fd = memfd_create("kvm_selftest", MFD_CLOEXEC);
if (backing_src_is_shared(src_type)) {
int memfd_flags = MFD_CLOEXEC;
if (src_type == VM_MEM_SRC_SHARED_HUGETLB)
memfd_flags |= MFD_HUGETLB;
region->fd = memfd_create("kvm_selftest", memfd_flags); TEST_ASSERT(region->fd != -1, "memfd_create failed, errno: %i", errno);
diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c index c7a265da5090..65fb8b43782c 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -240,6 +240,11 @@ const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i) .name = "shmem", .flag = MAP_SHARED, },
[VM_MEM_SRC_SHARED_HUGETLB] = {
.name = "shared_hugetlb",
/* No MAP_HUGETLB, we use MFD_HUGETLB instead. */
Is it worth calling out the difference between the two flags here?
.flag = MAP_SHARED,
}, }; _Static_assert(ARRAY_SIZE(aliases) == NUM_SRC_TYPES, "Missing new backing src types?");
@@ -262,6 +267,7 @@ size_t get_backing_src_pagesz(uint32_t i) case VM_MEM_SRC_ANONYMOUS_THP: return get_trans_hugepagesz(); case VM_MEM_SRC_ANONYMOUS_HUGETLB:
case VM_MEM_SRC_SHARED_HUGETLB: return get_def_hugetlb_pagesz(); default: return MAP_HUGE_PAGE_SIZE(flag);
-- 2.31.1.607.g51e8a6a459-goog