[LTP] [PATCH 5/7] KVM: Allow expected KVM_RUN errors in tst_kvm_run_instance()
Martin Doucha
mdoucha@suse.cz
Wed May 17 17:36:40 CEST 2023
Add a new parameter to tst_kvm_run_instance() for expected errno value,
e.g. EINTR for testing the possiblity to kill running guest. When
ioctl(KVM_RUN) fails with the expected errno, tst_kvm_run_instance()
will return -1 without terminating the test.
Default tst_kvm_run() function expects no KVM_RUN errors.
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
doc/kvm-test-api.txt | 9 ++++++---
testcases/kernel/kvm/include/kvm_host.h | 6 ++++--
testcases/kernel/kvm/lib_host.c | 22 +++++++++++++++++++---
3 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/doc/kvm-test-api.txt b/doc/kvm-test-api.txt
index 812e12b38..7e537afcb 100644
--- a/doc/kvm-test-api.txt
+++ b/doc/kvm-test-api.txt
@@ -194,9 +194,12 @@ previously allocated guarded buffers.
with at least `ram_size` bytes of memory. The VM instance info will be
stored in `inst`.
-- `void tst_kvm_run_instance(struct tst_kvm_instance *inst)` – Executes
- the program installed in KVM virtual machine `inst`. Any result messages
- returned by the VM will be automatically printed to controller program output.
+- `int tst_kvm_run_instance(struct tst_kvm_instance *inst, int exp_errno)` –
+ Executes the program installed in KVM virtual machine `inst`. Any result
+ messages returned by the VM will be automatically printed to controller
+ program output. Returns zero. If `exp_errno` is non-zero, the VM execution
+ syscall is allowed to fail with the `exp_errno` error code and
+ `tst_kvm_run_instance()` will return -1 instead of terminating the test.
- `void tst_kvm_destroy_instance(struct tst_kvm_instance *inst)` – Deletes
the KVM virtual machine `inst`. Note that the guarded buffers assigned
diff --git a/testcases/kernel/kvm/include/kvm_host.h b/testcases/kernel/kvm/include/kvm_host.h
index cbbdadc06..3e60d4738 100644
--- a/testcases/kernel/kvm/include/kvm_host.h
+++ b/testcases/kernel/kvm/include/kvm_host.h
@@ -125,9 +125,11 @@ struct kvm_cpuid2 *tst_kvm_get_cpuid(int sysfd);
void tst_kvm_create_instance(struct tst_kvm_instance *inst, size_t ram_size);
/*
- * Execute the given KVM instance and print results.
+ * Execute the given KVM instance and print results. If ioctl(KVM_RUN) is
+ * expected to fail, pass the expected error code in exp_errno, otherwise
+ * set it to zero. Returns last value returned by ioctl(KVM_RUN).
*/
-void tst_kvm_run_instance(struct tst_kvm_instance *inst);
+int tst_kvm_run_instance(struct tst_kvm_instance *inst, int exp_errno);
/*
* Close the given KVM instance.
diff --git a/testcases/kernel/kvm/lib_host.c b/testcases/kernel/kvm/lib_host.c
index a5f05449c..e33a5f5aa 100644
--- a/testcases/kernel/kvm/lib_host.c
+++ b/testcases/kernel/kvm/lib_host.c
@@ -234,14 +234,28 @@ void tst_kvm_create_instance(struct tst_kvm_instance *inst, size_t ram_size)
inst->result->message[0] = '\0';
}
-void tst_kvm_run_instance(struct tst_kvm_instance *inst)
+int tst_kvm_run_instance(struct tst_kvm_instance *inst, int exp_errno)
{
struct kvm_regs regs;
+ int ret;
while (1) {
inst->result->result = KVM_TNONE;
inst->result->message[0] = '\0';
- SAFE_IOCTL(inst->vcpu_fd, KVM_RUN, 0);
+ errno = 0;
+ ret = ioctl(inst->vcpu_fd, KVM_RUN, 0);
+
+ if (ret == -1) {
+ if (errno == exp_errno)
+ return ret;
+
+ tst_brk(TBROK | TERRNO, "ioctl(KVM_RUN) failed");
+ }
+
+ if (ret < 0) {
+ tst_brk(TBROK | TERRNO,
+ "Invalid ioctl(KVM_RUN) return value %d", ret);
+ }
if (inst->vcpu_info->exit_reason != KVM_EXIT_HLT) {
SAFE_IOCTL(inst->vcpu_fd, KVM_GET_REGS, ®s);
@@ -255,6 +269,8 @@ void tst_kvm_run_instance(struct tst_kvm_instance *inst)
tst_kvm_print_result(inst);
}
+
+ return ret;
}
void tst_kvm_destroy_instance(struct tst_kvm_instance *inst)
@@ -304,7 +320,7 @@ void tst_kvm_setup(void)
void tst_kvm_run(void)
{
tst_kvm_create_instance(&test_vm, DEFAULT_RAM_SIZE);
- tst_kvm_run_instance(&test_vm);
+ tst_kvm_run_instance(&test_vm, 0);
tst_kvm_destroy_instance(&test_vm);
tst_free_all();
}
--
2.40.0
More information about the ltp
mailing list