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@xxxxxxxxxx> --- 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