Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: selftests: add shmem backing source type

This lets us run the demand paging test on top of a shmem-backed area.
In follow-up commits, we'll 1) leverage this new capability to create an
alias mapping, and then 2) use the alias mapping to exercise UFFD minor
faults.

Signed-off-by: Axel Rasmussen <axelrasmussen@google.com>
Message-Id: <20210519200339.829146-8-axelrasmussen@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Axel Rasmussen and committed by
Paolo Bonzini
c9befd59 b3784bc2

+22 -1
+1
tools/testing/selftests/kvm/include/test_util.h
··· 84 84 VM_MEM_SRC_ANONYMOUS_HUGETLB_1GB, 85 85 VM_MEM_SRC_ANONYMOUS_HUGETLB_2GB, 86 86 VM_MEM_SRC_ANONYMOUS_HUGETLB_16GB, 87 + VM_MEM_SRC_SHMEM, 87 88 NUM_SRC_TYPES, 88 89 }; 89 90
+16 -1
tools/testing/selftests/kvm/lib/kvm_util.c
··· 847 847 if (alignment > 1) 848 848 region->mmap_size += alignment; 849 849 850 + region->fd = -1; 851 + if (src_type == VM_MEM_SRC_SHMEM) { 852 + region->fd = memfd_create("kvm_selftest", MFD_CLOEXEC); 853 + TEST_ASSERT(region->fd != -1, 854 + "memfd_create failed, errno: %i", errno); 855 + 856 + ret = ftruncate(region->fd, region->mmap_size); 857 + TEST_ASSERT(ret == 0, "ftruncate failed, errno: %i", errno); 858 + 859 + ret = fallocate(region->fd, 860 + FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 861 + region->mmap_size); 862 + TEST_ASSERT(ret == 0, "fallocate failed, errno: %i", errno); 863 + } 864 + 850 865 region->mmap_start = mmap(NULL, region->mmap_size, 851 866 PROT_READ | PROT_WRITE, 852 867 vm_mem_backing_src_alias(src_type)->flag, 853 - -1, 0); 868 + region->fd, 0); 854 869 TEST_ASSERT(region->mmap_start != MAP_FAILED, 855 870 "test_malloc failed, mmap_start: %p errno: %i", 856 871 region->mmap_start, errno);
+5
tools/testing/selftests/kvm/lib/test_util.c
··· 236 236 .name = "anonymous_hugetlb_16gb", 237 237 .flag = anon_huge_flags | MAP_HUGE_16GB, 238 238 }, 239 + [VM_MEM_SRC_SHMEM] = { 240 + .name = "shmem", 241 + .flag = MAP_SHARED, 242 + }, 239 243 }; 240 244 _Static_assert(ARRAY_SIZE(aliases) == NUM_SRC_TYPES, 241 245 "Missing new backing src types?"); ··· 257 253 258 254 switch (i) { 259 255 case VM_MEM_SRC_ANONYMOUS: 256 + case VM_MEM_SRC_SHMEM: 260 257 return getpagesize(); 261 258 case VM_MEM_SRC_ANONYMOUS_THP: 262 259 return get_trans_hugepagesz();