From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH] KVM: VMX: check apicv is active before using VT-d posted interrupt Date: Mon, 23 May 2016 16:23:27 +0200 Message-ID: References: <7fec7586-a7c6-59dd-7653-2f88de75fbe4@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Yang Zhang , rkrcmar@redhat.com, Feng Wu Return-path: Received: from mx1.redhat.com ([209.132.183.28]:40218 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755260AbcEWOXf (ORCPT ); Mon, 23 May 2016 10:23:35 -0400 In-Reply-To: <7fec7586-a7c6-59dd-7653-2f88de75fbe4@gmail.com> Sender: kvm-owner@vger.kernel.org List-ID: On 20/05/2016 09:50, Yang Zhang wrote: > VT-d posted interrupt is relying on the CPU side's posted interrupt. > Need to check whether VCPU's APICv is active before enabing VT-d posted > interrupt. > > Signed-off-by: Yang Zhang > Signed-off-by: Shengge Ding Please resend this patch without format=flowed (just use git-send-email), as it cannot be applied otherwise. Thanks, Paolo > --- > arch/x86/kvm/vmx.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index 7ebf27b..8ba87f3 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -2072,7 +2072,8 @@ static void vmx_vcpu_pi_load(struct kvm_vcpu > *vcpu, int cpu) > unsigned int dest; > > if (!kvm_arch_has_assigned_device(vcpu->kvm) || > - !irq_remapping_cap(IRQ_POSTING_CAP)) > + !irq_remapping_cap(IRQ_POSTING_CAP) || > + !kvm_vcpu_apicv_active(vcpu)) > return; > > do { > @@ -2180,7 +2181,8 @@ static void vmx_vcpu_pi_put(struct kvm_vcpu *vcpu) > struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu); > > if (!kvm_arch_has_assigned_device(vcpu->kvm) || > - !irq_remapping_cap(IRQ_POSTING_CAP)) > + !irq_remapping_cap(IRQ_POSTING_CAP) || > + !kvm_vcpu_apicv_active(vcpu)) > return; > > /* Set SN when the vCPU is preempted */ > @@ -10698,7 +10700,8 @@ static int vmx_pre_block(struct kvm_vcpu *vcpu) > struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu); > > if (!kvm_arch_has_assigned_device(vcpu->kvm) || > - !irq_remapping_cap(IRQ_POSTING_CAP)) > + !irq_remapping_cap(IRQ_POSTING_CAP) || > + !kvm_vcpu_apicv_active(vcpu)) > return 0; > > vcpu->pre_pcpu = vcpu->cpu; > @@ -10764,7 +10767,8 @@ static void vmx_post_block(struct kvm_vcpu *vcpu) > unsigned long flags; > > if (!kvm_arch_has_assigned_device(vcpu->kvm) || > - !irq_remapping_cap(IRQ_POSTING_CAP)) > + !irq_remapping_cap(IRQ_POSTING_CAP) || > + !kvm_vcpu_apicv_active(vcpu)) > return; > > do { > @@ -10817,7 +10821,8 @@ static int vmx_update_pi_irte(struct kvm *kvm, > unsigned int host_irq, > int idx, ret = -EINVAL; > > if (!kvm_arch_has_assigned_device(kvm) || > - !irq_remapping_cap(IRQ_POSTING_CAP)) > + !irq_remapping_cap(IRQ_POSTING_CAP) || > + !kvm_vcpu_apicv_active(kvm->vcpus[0])) > return 0; > > idx = srcu_read_lock(&kvm->irq_srcu);