From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 3/3] Cleanup vmx_intr_assist() Date: Sat, 11 Apr 2009 14:30:30 +0300 Message-ID: <49E07F56.30107@redhat.com> References: <20090407090811.2074.19043.stgit@trex.usersys.redhat.com> <20090407090822.2074.27147.stgit@trex.usersys.redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Gleb Natapov Return-path: Received: from mx2.redhat.com ([66.187.237.31]:34802 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751843AbZDKLae (ORCPT ); Sat, 11 Apr 2009 07:30:34 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n3BBUYsa014997 for ; Sat, 11 Apr 2009 07:30:34 -0400 In-Reply-To: <20090407090822.2074.27147.stgit@trex.usersys.redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Gleb Natapov wrote: > Signed-off-by: Gleb Natapov > --- > > arch/x86/kvm/vmx.c | 55 ++++++++++++++++++++++++++++------------------------ > 1 files changed, 30 insertions(+), 25 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index 06252f7..9eb518f 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -3309,6 +3309,34 @@ static void vmx_complete_interrupts(struct vcpu_vmx *vmx) > } > } > > +static void vmx_intr_inject(struct kvm_vcpu *vcpu) > +{ > + /* try to reinject previous events if any */ > + if (vcpu->arch.nmi_injected) { > + vmx_inject_nmi(vcpu); > + return; > + } > + > + if (vcpu->arch.interrupt.pending) { > + vmx_inject_irq(vcpu, vcpu->arch.interrupt.nr); > + return; > + } > + > + /* try to inject new event if pending */ > + if (vcpu->arch.nmi_pending) { > + if (vcpu->arch.nmi_window_open) { > + vcpu->arch.nmi_pending = false; > + vcpu->arch.nmi_injected = true; > + vmx_inject_nmi(vcpu); > + } > + } else if (kvm_cpu_has_interrupt(vcpu)) { > + if (vcpu->arch.interrupt_window_open) { > + kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu)); > + vmx_inject_irq(vcpu, vcpu->arch.interrupt.nr); > + } > + } > +} > + > static void vmx_intr_assist(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) > { > bool req_int_win = !irqchip_in_kernel(vcpu->kvm) && > @@ -3323,32 +3351,9 @@ static void vmx_intr_assist(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) > GUEST_INTR_STATE_STI | > GUEST_INTR_STATE_MOV_SS); > > - if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) { > - if (vcpu->arch.interrupt.pending) { > - enable_nmi_window(vcpu); > - } else if (vcpu->arch.nmi_window_open) { > - vcpu->arch.nmi_pending = false; > - vcpu->arch.nmi_injected = true; > - } else { > - enable_nmi_window(vcpu); > - return; > - } > - } > - > - if (vcpu->arch.nmi_injected) { > - vmx_inject_nmi(vcpu); > - goto out; > - } > - > - if (!vcpu->arch.interrupt.pending && kvm_cpu_has_interrupt(vcpu)) { > - if (vcpu->arch.interrupt_window_open) > - kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu)); > - } > - > - if (vcpu->arch.interrupt.pending) > - vmx_inject_irq(vcpu, vcpu->arch.interrupt.nr); > + vmx_intr_inject(vcpu); > > -out: > + /* enable NMI/IRQ window open exits if needed */ > if (vcpu->arch.nmi_pending) > enable_nmi_window(vcpu); > else if (kvm_cpu_has_interrupt(vcpu) || req_int_win) > Not sure I understand the motivation. Just replace a 'goto out' with a return? -- Do not meddle in the internals of kernels, for they are subtle and quick to panic.