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>
This commit is contained in:
Родитель
b3784bc28c
Коммит
c9befd5958
|
@ -84,6 +84,7 @@ enum vm_mem_backing_src_type {
|
|||
VM_MEM_SRC_ANONYMOUS_HUGETLB_1GB,
|
||||
VM_MEM_SRC_ANONYMOUS_HUGETLB_2GB,
|
||||
VM_MEM_SRC_ANONYMOUS_HUGETLB_16GB,
|
||||
VM_MEM_SRC_SHMEM,
|
||||
NUM_SRC_TYPES,
|
||||
};
|
||||
|
||||
|
|
|
@ -847,10 +847,25 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
|
|||
if (alignment > 1)
|
||||
region->mmap_size += alignment;
|
||||
|
||||
region->fd = -1;
|
||||
if (src_type == VM_MEM_SRC_SHMEM) {
|
||||
region->fd = memfd_create("kvm_selftest", MFD_CLOEXEC);
|
||||
TEST_ASSERT(region->fd != -1,
|
||||
"memfd_create failed, errno: %i", errno);
|
||||
|
||||
ret = ftruncate(region->fd, region->mmap_size);
|
||||
TEST_ASSERT(ret == 0, "ftruncate failed, errno: %i", errno);
|
||||
|
||||
ret = fallocate(region->fd,
|
||||
FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0,
|
||||
region->mmap_size);
|
||||
TEST_ASSERT(ret == 0, "fallocate failed, errno: %i", errno);
|
||||
}
|
||||
|
||||
region->mmap_start = mmap(NULL, region->mmap_size,
|
||||
PROT_READ | PROT_WRITE,
|
||||
vm_mem_backing_src_alias(src_type)->flag,
|
||||
-1, 0);
|
||||
region->fd, 0);
|
||||
TEST_ASSERT(region->mmap_start != MAP_FAILED,
|
||||
"test_malloc failed, mmap_start: %p errno: %i",
|
||||
region->mmap_start, errno);
|
||||
|
|
|
@ -236,6 +236,10 @@ const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i)
|
|||
.name = "anonymous_hugetlb_16gb",
|
||||
.flag = anon_huge_flags | MAP_HUGE_16GB,
|
||||
},
|
||||
[VM_MEM_SRC_SHMEM] = {
|
||||
.name = "shmem",
|
||||
.flag = MAP_SHARED,
|
||||
},
|
||||
};
|
||||
_Static_assert(ARRAY_SIZE(aliases) == NUM_SRC_TYPES,
|
||||
"Missing new backing src types?");
|
||||
|
@ -253,6 +257,7 @@ size_t get_backing_src_pagesz(uint32_t i)
|
|||
|
||||
switch (i) {
|
||||
case VM_MEM_SRC_ANONYMOUS:
|
||||
case VM_MEM_SRC_SHMEM:
|
||||
return getpagesize();
|
||||
case VM_MEM_SRC_ANONYMOUS_THP:
|
||||
return get_trans_hugepagesz();
|
||||
|
|
Загрузка…
Ссылка в новой задаче