From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH 1/2] KVM: nVMX: Fix nested vmexit ack intr before load vmcs01 Date: Mon, 04 Aug 2014 14:51:29 +0200 Message-ID: <53DF81D1.1060701@redhat.com> References: <1406880727-60001-1-git-send-email-wanpeng.li@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , Gleb Natapov , Bandan Das , Zhang Yang , kvm@vger.kernel.org, linux-kernel@vger.kernel.org To: Wanpeng Li , Jan Kiszka Return-path: Received: from mx1.redhat.com ([209.132.183.28]:20989 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752263AbaHDMvh (ORCPT ); Mon, 4 Aug 2014 08:51:37 -0400 In-Reply-To: <1406880727-60001-1-git-send-email-wanpeng.li@linux.intel.com> Sender: kvm-owner@vger.kernel.org List-ID: Il 01/08/2014 10:12, Wanpeng Li ha scritto: > External interrupt will cause L1 vmexit w/ reason external interrupt when L2 is > running. Then L1 will pick up the interrupt through vmcs12 if L1 set the ack > interrupt bit. Commit 77b0f5d (KVM: nVMX: Ack and write vector info to intr_info > if L1 asks us to) get intr that belongs to L1 before load vmcs01 which is wrong, > especially this lead to the obvious L1 ack APICv behavior weired since APICv > is for L1 instead of L2. This patch fix it by ack intr after load vmcs01. > > Signed-off-by: Wanpeng Li > --- > arch/x86/kvm/vmx.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index e618f34..b8122b3 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -8754,14 +8754,6 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, > prepare_vmcs12(vcpu, vmcs12, exit_reason, exit_intr_info, > exit_qualification); > > - if ((exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT) > - && nested_exit_intr_ack_set(vcpu)) { > - int irq = kvm_cpu_get_interrupt(vcpu); > - WARN_ON(irq < 0); > - vmcs12->vm_exit_intr_info = irq | > - INTR_INFO_VALID_MASK | INTR_TYPE_EXT_INTR; > - } > - > trace_kvm_nested_vmexit_inject(vmcs12->vm_exit_reason, > vmcs12->exit_qualification, > vmcs12->idt_vectoring_info_field, > @@ -8771,6 +8763,14 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, > > vmx_load_vmcs01(vcpu); > > + if ((exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT) > + && nested_exit_intr_ack_set(vcpu)) { > + int irq = kvm_cpu_get_interrupt(vcpu); > + WARN_ON(irq < 0); > + vmcs12->vm_exit_intr_info = irq | > + INTR_INFO_VALID_MASK | INTR_TYPE_EXT_INTR; > + } > + > vm_entry_controls_init(vmx, vmcs_read32(VM_ENTRY_CONTROLS)); > vm_exit_controls_init(vmx, vmcs_read32(VM_EXIT_CONTROLS)); > vmx_segment_cache_clear(vmx); > Reviewed-by: Paolo Bonzini