> -----Original Message----- > From: kvm-owner@xxxxxxxxxxxxxxx [mailto:kvm-owner@xxxxxxxxxxxxxxx] > On Behalf Of Wanpeng Li > Sent: Friday, August 01, 2014 4:12 PM > To: Paolo Bonzini; Jan Kiszka > Cc: Marcelo Tosatti; Gleb Natapov; Bandan Das; Zhang, Yang Z; > kvm@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Wanpeng Li > Subject: [PATCH 1/2] KVM: nVMX: Fix nested vmexit ack intr before load > vmcs01 > > 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 <wanpeng.li@xxxxxxxxxxxxxxx> Tested-by: Liu, RongrongX <rongrongx.liu@xxxxxxxxx> > --- > 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); > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in the body of > a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at > http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html