[PATCH v2 113/144] KVM: selftests: Sync stage before VM is freed in hypercalls test

Sean Christopherson
2022-06-03T01:01:58Z

Sync the next stage using the VM before said VM is potentially freed by
the TEST_STAGE_HVC_IFACE_FEAT_DISABLED stage.

Opportunistically take a double pointer in anticipation of also having to
set the new vCPU pointer once the test stops hardcoding '0' everywhere.

Signed-off-by: Sean Christopherson <seanjc@google.com>
---
.../selftests/kvm/aarch64/hypercalls.c | 27 +++++++++----------
1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/hypercalls.c b/tools/testing/selftests/kvm/aarch64/hypercalls.c
index b1f99e786d05..44ca840e8219 100644
--- a/tools/testing/selftests/kvm/aarch64/hypercalls.c
+++ b/tools/testing/selftests/kvm/aarch64/hypercalls.c
@@ -246,32 +246,31 @@ static struct kvm_vm *test_vm_create(void)
return vm;
}

-static struct kvm_vm *test_guest_stage(struct kvm_vm *vm)
+static void test_guest_stage(struct kvm_vm **vm)
{
- struct kvm_vm *ret_vm = vm;
+ int prev_stage = stage;

- pr_debug("Stage: %d\n", stage);
+ pr_debug("Stage: %d\n", prev_stage);

- switch (stage) {
+ /* Sync the stage early, the VM might be freed below. */
+ stage++;
+ sync_global_to_guest(*vm, stage);
+
+ switch (prev_stage) {
case TEST_STAGE_REG_IFACE:
- test_fw_regs_after_vm_start(vm);
+ test_fw_regs_after_vm_start(*vm);
break;
case TEST_STAGE_HVC_IFACE_FEAT_DISABLED:
/* Start a new VM so that all the features are now enabled by default */
- kvm_vm_free(vm);
- ret_vm = test_vm_create();
+ kvm_vm_free(*vm);
+ *vm = test_vm_create();
break;
case TEST_STAGE_HVC_IFACE_FEAT_ENABLED:
case TEST_STAGE_HVC_IFACE_FALSE_INFO:
break;
default:
- TEST_FAIL("Unknown test stage: %d\n", stage);
+ TEST_FAIL("Unknown test stage: %d\n", prev_stage);
}
-
- stage++;
- sync_global_to_guest(vm, stage);
-
- return ret_vm;
}

static void test_run(void)
@@ -289,7 +288,7 @@ static void test_run(void)

switch (get_ucall(vm, 0, &uc)) {
case UCALL_SYNC:
- vm = test_guest_stage(vm);
+ test_guest_stage(&vm);
break;
case UCALL_DONE:
guest_done = true;
--
2.36.1.255.ge46751e96f-goog