From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Subject: [PATCH 19/52] KVM: PPC: Book3s: PR: Disable preemption in vcpu_run Date: Fri, 13 Jan 2012 15:31:22 +0100 Message-ID: <1326465115-5976-20-git-send-email-agraf@suse.de> References: <1326465115-5976-1-git-send-email-agraf@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: kvm list , Avi Kivity , Marcelo Tosatti To: kvm-ppc@vger.kernel.org Return-path: In-Reply-To: <1326465115-5976-1-git-send-email-agraf@suse.de> Sender: kvm-ppc-owner@vger.kernel.org List-Id: kvm.vger.kernel.org When entering the guest, we want to make sure we're not getting preempt= ed away, so let's disable preemption on entry, but enable it again while h= andling guest exits. Reported-by: J=C3=B6rg Sommer Signed-off-by: Alexander Graf --- arch/powerpc/kvm/book3s_pr.c | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.= c index 203a7b7..19af2bf 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c @@ -517,6 +517,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct = kvm_vcpu *vcpu, run->ready_for_interrupt_injection =3D 1; =20 trace_kvm_book3s_exit(exit_nr, vcpu); + preempt_enable(); kvm_resched(vcpu); switch (exit_nr) { case BOOK3S_INTERRUPT_INST_STORAGE: @@ -761,6 +762,8 @@ program_interrupt: run->exit_reason =3D KVM_EXIT_INTR; r =3D -EINTR; } else { + preempt_disable(); + /* In case an interrupt came in that was triggered * from userspace (like DEC), we need to check what * to inject now! */ @@ -923,10 +926,13 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, stru= ct kvm_vcpu *vcpu) #endif ulong ext_msr; =20 + preempt_disable(); + /* Check if we can run the vcpu at all */ if (!vcpu->arch.sane) { kvm_run->exit_reason =3D KVM_EXIT_INTERNAL_ERROR; - return -EINVAL; + ret =3D -EINVAL; + goto out; } =20 kvmppc_core_prepare_to_enter(vcpu); @@ -934,7 +940,8 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct= kvm_vcpu *vcpu) /* No need to go into the guest when all we do is going out */ if (signal_pending(current)) { kvm_run->exit_reason =3D KVM_EXIT_INTR; - return -EINTR; + ret =3D -EINTR; + goto out; } =20 /* Save FPU state in stack */ @@ -1004,6 +1011,8 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, stru= ct kvm_vcpu *vcpu) current->thread.used_vsr =3D used_vsr; #endif =20 +out: + preempt_enable(); return ret; } =20 --=20 1.6.0.2