From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: Re: [PATCH 2/5] Don't call svm_complete_interrupts for nested guests Date: Fri, 18 Sep 2009 15:39:58 +0200 Message-ID: <4AB38DAE.40604@siemens.com> References: <1253278832-31803-1-git-send-email-agraf@suse.de> <1253278832-31803-2-git-send-email-agraf@suse.de> <1253278832-31803-3-git-send-email-agraf@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Alexander Graf Return-path: Received: from thoth.sbs.de ([192.35.17.2]:20986 "EHLO thoth.sbs.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752673AbZIRNj7 (ORCPT ); Fri, 18 Sep 2009 09:39:59 -0400 In-Reply-To: <1253278832-31803-3-git-send-email-agraf@suse.de> Sender: kvm-owner@vger.kernel.org List-ID: Alexander Graf wrote: > SVM has some cleanup code, that tries to reinject interrupts and exceptions > when the guest didn't manage to deal with them yet. It basically transfers > them to KVM internal state. > > Unfortunately, the internal state is reserved for the L1 guest state, so we > shouldn't try to go through that logic when running a nested guest. > > When doing something the host KVM can handle, let's just reinject the event > into the L2 guest, because we didn't touch its state anyways. > > Signed-off-by: Alexander Graf > --- > arch/x86/kvm/svm.c | 18 ++++++++++++++---- > 1 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index f12a669..61efd13 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -2349,7 +2349,10 @@ static int handle_exit(struct kvm_vcpu *vcpu) > trace_kvm_exit(exit_code, svm->vmcb->save.rip); > > if (is_nested(svm)) { > + struct vmcb_control_area *control = &svm->vmcb->control; > int vmexit; > + int type; > + int vec; > > nsvm_printk("nested handle_exit: 0x%x | 0x%lx | 0x%lx | 0x%lx\n", > exit_code, svm->vmcb->control.exit_info_1, > @@ -2362,9 +2365,18 @@ static int handle_exit(struct kvm_vcpu *vcpu) > > if (vmexit == NESTED_EXIT_DONE) > return 1; > - } > > - svm_complete_interrupts(svm); > + type = control->exit_int_info & SVM_EXITINTINFO_TYPE_MASK; > + vec = control->exit_int_info & SVM_EXITINTINFO_VEC_MASK; > + if ((type == SVM_EXITINTINFO_TYPE_INTR) || > + ((type == SVM_EXITINTINFO_TYPE_EXEPT) && !kvm_exception_is_soft(vec))) { > + control->event_inj = control->exit_int_info; > + control->event_inj_err = control->exit_int_info_err; > + } > + } else { > + /* Don't interpret exit_info for nested guests */ Doesn't this comment belong to the block above? > + svm_complete_interrupts(svm); > + } > > if (npt_enabled) { > int mmu_reload = 0; > @@ -2602,8 +2614,6 @@ static void svm_complete_interrupts(struct vcpu_svm *svm) > case SVM_EXITINTINFO_TYPE_EXEPT: > /* In case of software exception do not reinject an exception > vector, but re-execute and instruction instead */ > - if (is_nested(svm)) > - break; > if (kvm_exception_is_soft(vector)) > break; > if (exitintinfo & SVM_EXITINTINFO_VALID_ERR) { Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux