From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Jones Subject: [PATCH v3 05/10] KVM: arm/arm64: don't clear exit request from caller Date: Wed, 3 May 2017 18:06:30 +0200 Message-ID: <20170503160635.21669-6-drjones@redhat.com> References: <20170503160635.21669-1-drjones@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: marc.zyngier@arm.com, cdall@linaro.org, pbonzini@redhat.com To: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org Return-path: In-Reply-To: <20170503160635.21669-1-drjones@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu List-Id: kvm.vger.kernel.org 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 --- 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