[PATCH v3 05/10] KVM: arm/arm64: don't clear exit request from caller

Andrew Jones
2017-05-03T16:06:30Z

VCPU requests that the receiver should handle should only be cleared
by the receiver. Not only does this properly implement the protocol,
but also avoids bugs where one VCPU clears another VCPU's request,
before the receiving VCPU has had a chance to see it. ARM VCPUs
currently only handle one request, EXIT, and handling it is achieved
by checking pause to see if the VCPU should sleep.

Signed-off-by: Andrew Jones <drjones@redhat.com>
---
arch/arm/kvm/arm.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 9174ed13135a..7be0d9b0c63a 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -553,7 +553,6 @@ void kvm_arm_resume_vcpu(struct kvm_vcpu *vcpu)
{
struct swait_queue_head *wq = kvm_arch_vcpu_wq(vcpu);

- kvm_clear_request(KVM_REQ_VCPU_EXIT, vcpu);
vcpu->arch.pause = false;
swake_up(wq);
}
@@ -625,7 +624,14 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)

update_vttbr(vcpu->kvm);

- if (vcpu->arch.power_off || vcpu->arch.pause)
+ if (kvm_request_pending(vcpu)) {
+ if (kvm_check_request(KVM_REQ_VCPU_EXIT, vcpu)) {
+ if (vcpu->arch.pause)
+ vcpu_sleep(vcpu);
+ }
+ }
+
+ if (vcpu->arch.power_off)
vcpu_sleep(vcpu);

/*
--
2.9.3