diff options
author | Andrew Morton <[email protected]> | 2023-01-11 14:01:55 -0800 |
---|---|---|
committer | Andrew Morton <[email protected]> | 2023-01-11 14:01:55 -0800 |
commit | 18e6340365eab44339a0aadab76c3d26a2406a72 (patch) | |
tree | 0322e1e0507b32710b0fbb44dd826dc51558b3de /tools/testing/selftests/kvm/lib/ucall_common.c | |
parent | 1d4beeb4edc79b32cfedd07dab9cf59b6df2ee71 (diff) | |
parent | b7bfaa761d760e72a969d116517eaa12e404c262 (diff) |
Merge branch 'master' into mm-nonmm-stable
Diffstat (limited to 'tools/testing/selftests/kvm/lib/ucall_common.c')
-rw-r--r-- | tools/testing/selftests/kvm/lib/ucall_common.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index 0cc0971ce60e..2f0e2ea941cc 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -4,6 +4,8 @@ #include "linux/bitmap.h" #include "linux/atomic.h" +#define GUEST_UCALL_FAILED -1 + struct ucall_header { DECLARE_BITMAP(in_use, KVM_MAX_VCPUS); struct ucall ucalls[KVM_MAX_VCPUS]; @@ -41,7 +43,8 @@ static struct ucall *ucall_alloc(void) struct ucall *uc; int i; - GUEST_ASSERT(ucall_pool); + if (!ucall_pool) + goto ucall_failed; for (i = 0; i < KVM_MAX_VCPUS; ++i) { if (!test_and_set_bit(i, ucall_pool->in_use)) { @@ -51,7 +54,13 @@ static struct ucall *ucall_alloc(void) } } - GUEST_ASSERT(0); +ucall_failed: + /* + * If the vCPU cannot grab a ucall structure, make a bare ucall with a + * magic value to signal to get_ucall() that things went sideways. + * GUEST_ASSERT() depends on ucall_alloc() and so cannot be used here. + */ + ucall_arch_do_ucall(GUEST_UCALL_FAILED); return NULL; } @@ -93,6 +102,9 @@ uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) addr = ucall_arch_get_ucall(vcpu); if (addr) { + TEST_ASSERT(addr != (void *)GUEST_UCALL_FAILED, + "Guest failed to allocate ucall struct"); + memcpy(uc, addr, sizeof(*uc)); vcpu_run_complete_io(vcpu); } else { |