From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751251AbdEaSVo (ORCPT ); Wed, 31 May 2017 14:21:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35839 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751041AbdEaSVm (ORCPT ); Wed, 31 May 2017 14:21:42 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C8898C0CDE22 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=alex.williamson@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com C8898C0CDE22 Date: Wed, 31 May 2017 12:21:10 -0600 From: Alex Williamson To: Eric Auger Cc: eric.auger.pro@gmail.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, pbonzini@redhat.com, marc.zyngier@arm.com, christoffer.dall@linaro.org, drjones@redhat.com, wei@redhat.com Subject: Re: [PATCH 04/10] VFIO: pci: Add automasked field to vfio_pci_irq_ctx Message-ID: <20170531122110.1d35d6d4@w520.home> In-Reply-To: <1495656803-28011-5-git-send-email-eric.auger@redhat.com> References: <1495656803-28011-1-git-send-email-eric.auger@redhat.com> <1495656803-28011-5-git-send-email-eric.auger@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 31 May 2017 18:21:32 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 24 May 2017 22:13:17 +0200 Eric Auger wrote: > For direct EOI modality we will need to differentiate a userspace > masking from the IRQ handler auto-masking. > > Signed-off-by: Eric Auger > --- > drivers/vfio/pci/vfio_pci_intrs.c | 15 +++++++++------ > drivers/vfio/pci/vfio_pci_private.h | 1 + > 2 files changed, 10 insertions(+), 6 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 1c46045..d4d377b 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -52,7 +52,7 @@ void vfio_pci_intx_mask(struct vfio_pci_device *vdev) > if (unlikely(!is_intx(vdev))) { > if (vdev->pci_2_3) > pci_intx(pdev, 0); > - } else if (!vdev->ctx[0].masked) { > + } else if (!vdev->ctx[0].masked && !vdev->ctx[0].automasked) { > /* > * Can't use check_and_mask here because we always want to > * mask, not just when something is pending. > @@ -90,7 +90,8 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused) > if (unlikely(!is_intx(vdev))) { > if (vdev->pci_2_3) > pci_intx(pdev, 1); > - } else if (vdev->ctx[0].masked && !vdev->virq_disabled) { > + } else if ((vdev->ctx[0].masked || vdev->ctx[0].automasked) && > + !vdev->virq_disabled) { > /* > * A pending interrupt here would immediately trigger, > * but we can avoid that overhead by just re-sending > @@ -103,6 +104,7 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused) > enable_irq(pdev->irq); > > vdev->ctx[0].masked = (ret > 0); > + vdev->ctx[0].automasked = (ret > 0); > } This looks suspicious, if we leave this function with the interrupt masked, isn't it due to an automask, not a usermask? > > spin_unlock_irqrestore(&vdev->irqlock, flags); > @@ -126,11 +128,12 @@ static irqreturn_t vfio_intx_handler(int irq, void *dev_id) > > if (!vdev->pci_2_3) { > disable_irq_nosync(vdev->pdev->irq); > - vdev->ctx[0].masked = true; > + vdev->ctx[0].automasked = true; > ret = IRQ_HANDLED; > - } else if (!vdev->ctx[0].masked && /* may be shared */ > - pci_check_and_mask_intx(vdev->pdev)) { > - vdev->ctx[0].masked = true; > + } else if (!vdev->ctx[0].masked && !vdev->ctx[0].automasked && > + pci_check_and_mask_intx(vdev->pdev)) { > + /* shared INTx */ > + vdev->ctx[0].automasked = true; > ret = IRQ_HANDLED; > } > > diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h > index f561ac1..f7f1101 100644 > --- a/drivers/vfio/pci/vfio_pci_private.h > +++ b/drivers/vfio/pci/vfio_pci_private.h > @@ -35,6 +35,7 @@ struct vfio_pci_irq_ctx { > struct virqfd *mask; > char *name; > bool masked; > + bool automasked; > struct irq_bypass_producer producer; > }; > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Williamson Subject: Re: [PATCH 04/10] VFIO: pci: Add automasked field to vfio_pci_irq_ctx Date: Wed, 31 May 2017 12:21:10 -0600 Message-ID: <20170531122110.1d35d6d4@w520.home> References: <1495656803-28011-1-git-send-email-eric.auger@redhat.com> <1495656803-28011-5-git-send-email-eric.auger@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, marc.zyngier@arm.com, linux-kernel@vger.kernel.org, pbonzini@redhat.com, kvmarm@lists.cs.columbia.edu, eric.auger.pro@gmail.com To: Eric Auger Return-path: In-Reply-To: <1495656803-28011-5-git-send-email-eric.auger@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu List-Id: kvm.vger.kernel.org On Wed, 24 May 2017 22:13:17 +0200 Eric Auger wrote: > For direct EOI modality we will need to differentiate a userspace > masking from the IRQ handler auto-masking. > > Signed-off-by: Eric Auger > --- > drivers/vfio/pci/vfio_pci_intrs.c | 15 +++++++++------ > drivers/vfio/pci/vfio_pci_private.h | 1 + > 2 files changed, 10 insertions(+), 6 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 1c46045..d4d377b 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -52,7 +52,7 @@ void vfio_pci_intx_mask(struct vfio_pci_device *vdev) > if (unlikely(!is_intx(vdev))) { > if (vdev->pci_2_3) > pci_intx(pdev, 0); > - } else if (!vdev->ctx[0].masked) { > + } else if (!vdev->ctx[0].masked && !vdev->ctx[0].automasked) { > /* > * Can't use check_and_mask here because we always want to > * mask, not just when something is pending. > @@ -90,7 +90,8 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused) > if (unlikely(!is_intx(vdev))) { > if (vdev->pci_2_3) > pci_intx(pdev, 1); > - } else if (vdev->ctx[0].masked && !vdev->virq_disabled) { > + } else if ((vdev->ctx[0].masked || vdev->ctx[0].automasked) && > + !vdev->virq_disabled) { > /* > * A pending interrupt here would immediately trigger, > * but we can avoid that overhead by just re-sending > @@ -103,6 +104,7 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused) > enable_irq(pdev->irq); > > vdev->ctx[0].masked = (ret > 0); > + vdev->ctx[0].automasked = (ret > 0); > } This looks suspicious, if we leave this function with the interrupt masked, isn't it due to an automask, not a usermask? > > spin_unlock_irqrestore(&vdev->irqlock, flags); > @@ -126,11 +128,12 @@ static irqreturn_t vfio_intx_handler(int irq, void *dev_id) > > if (!vdev->pci_2_3) { > disable_irq_nosync(vdev->pdev->irq); > - vdev->ctx[0].masked = true; > + vdev->ctx[0].automasked = true; > ret = IRQ_HANDLED; > - } else if (!vdev->ctx[0].masked && /* may be shared */ > - pci_check_and_mask_intx(vdev->pdev)) { > - vdev->ctx[0].masked = true; > + } else if (!vdev->ctx[0].masked && !vdev->ctx[0].automasked && > + pci_check_and_mask_intx(vdev->pdev)) { > + /* shared INTx */ > + vdev->ctx[0].automasked = true; > ret = IRQ_HANDLED; > } > > diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h > index f561ac1..f7f1101 100644 > --- a/drivers/vfio/pci/vfio_pci_private.h > +++ b/drivers/vfio/pci/vfio_pci_private.h > @@ -35,6 +35,7 @@ struct vfio_pci_irq_ctx { > struct virqfd *mask; > char *name; > bool masked; > + bool automasked; > struct irq_bypass_producer producer; > }; >