[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 04/10] KVM: selftests: Exercise restrictedmem allocation and
From: |
Ackerley Tng |
Subject: |
[RFC PATCH 04/10] KVM: selftests: Exercise restrictedmem allocation and truncation code after KVM invalidation code has been unbound |
Date: |
Thu, 16 Mar 2023 00:30:57 +0000 |
The kernel interfaces restrictedmem_bind and restrictedmem_unbind are
used by KVM to bind/unbind kvm functions to restrictedmem's
invalidate_start and invalidate_end callbacks.
After the KVM VM is freed, the KVM functions should have been unbound
from the restrictedmem_fd's callbacks.
In this test, we exercise fallocate to back and unback memory using
the restrictedmem fd, and we expect no problems (crashes) after the
KVM functions have been unbound.
Signed-off-by: Ackerley Tng <ackerleytng@google.com>
---
.../kvm/x86_64/private_mem_conversions_test.c | 26 ++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c
b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c
index f2c1e4450b0e..7741916818db 100644
--- a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c
+++ b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c
@@ -203,6 +203,30 @@ static void handle_exit_hypercall(struct kvm_vcpu *vcpu)
run->hypercall.ret = 0;
}
+static void test_invalidation_code_unbound(struct kvm_vm *vm)
+{
+ uint32_t fd;
+ uint64_t offset;
+ struct userspace_mem_region *region;
+
+ region = memslot2region(vm, DATA_SLOT);
+ fd = region->region.restrictedmem_fd;
+ offset = region->region.restrictedmem_offset;
+
+ kvm_vm_free(vm);
+
+ /*
+ * At this point the KVM invalidation code should have been unbound from
+ * the vm. We do allocation and truncation to exercise the restrictedmem
+ * code. There should be no issues after the unbinding happens.
+ */
+ if (fallocate(fd, 0, offset, DATA_SIZE))
+ TEST_FAIL("Unexpected error in fallocate");
+ if (fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
+ offset, DATA_SIZE))
+ TEST_FAIL("Unexpected error in fallocate");
+}
+
static void test_mem_conversions(enum vm_mem_backing_src_type src_type)
{
struct kvm_vcpu *vcpu;
@@ -270,7 +294,7 @@ static void test_mem_conversions(enum
vm_mem_backing_src_type src_type)
}
done:
- kvm_vm_free(vm);
+ test_invalidation_code_unbound(vm);
}
int main(int argc, char *argv[])
--
2.40.0.rc2.332.ga46443480c-goog
- [RFC PATCH 00/10] Additional selftests for restrictedmem, Ackerley Tng, 2023/03/15
- [RFC PATCH 01/10] KVM: selftests: Test error message fixes for memfd_restricted selftests, Ackerley Tng, 2023/03/15
- [RFC PATCH 02/10] KVM: selftests: Test that ftruncate to non-page-aligned size on a restrictedmem fd should fail, Ackerley Tng, 2023/03/15
- [RFC PATCH 03/10] KVM: selftests: Test that VM private memory should not be readable from host, Ackerley Tng, 2023/03/15
- [RFC PATCH 04/10] KVM: selftests: Exercise restrictedmem allocation and truncation code after KVM invalidation code has been unbound,
Ackerley Tng <=
- [RFC PATCH 05/10] KVM: selftests: Generalize private_mem_conversions_test for parallel execution, Ackerley Tng, 2023/03/15
- [RFC PATCH 06/10] KVM: selftests: Default private_mem_conversions_test to use 1 memslot for test data, Ackerley Tng, 2023/03/15
- [RFC PATCH 07/10] KVM: selftests: Add vm_userspace_mem_region_add_with_restrictedmem, Ackerley Tng, 2023/03/15
- [RFC PATCH 08/10] KVM: selftests: Default private_mem_conversions_test to use 1 restrictedmem file for test data, Ackerley Tng, 2023/03/15
- [RFC PATCH 09/10] KVM: selftests: Add tests around sharing a restrictedmem fd, Ackerley Tng, 2023/03/15
- [RFC PATCH 10/10] KVM: selftests: Test KVM exit behavior for private memory/access, Ackerley Tng, 2023/03/15