Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752083AbbHLS44 (ORCPT ); Wed, 12 Aug 2015 14:56:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33333 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751968AbbHLS4x (ORCPT ); Wed, 12 Aug 2015 14:56:53 -0400 Message-ID: <1439405812.4023.530.camel@redhat.com> Subject: Re: [PATCH v3 06/10] VFIO: platform: add irq bypass producer management From: Alex Williamson To: Eric Auger Cc: eric.auger@st.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, christoffer.dall@linaro.org, marc.zyngier@arm.com, feng.wu@intel.com, linux-kernel@vger.kernel.org, patches@linaro.org, pbonzini@redhat.com Date: Wed, 12 Aug 2015 12:56:52 -0600 In-Reply-To: <1439212864-12954-7-git-send-email-eric.auger@linaro.org> References: <1439212864-12954-1-git-send-email-eric.auger@linaro.org> <1439212864-12954-7-git-send-email-eric.auger@linaro.org> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2914 Lines: 87 On Mon, 2015-08-10 at 15:21 +0200, Eric Auger wrote: > This patch populates the IRQ bypass callacks: > - stop/start producer simply consist in disabling/enabling the host irq > - add/del consumer: basically set the automasked flag to false/true > > Signed-off-by: Eric Auger > > --- > v2 -> v3: > - vfio_platform_irq_bypass_add_consumer now returns an error in case > the IRQ is recognized as active > - active boolean not set anymore > - do not VFIO mask the IRQ anymore on unforward > > v1 -> v2: > - device handle caching in vfio_platform_device is introduced in a > separate patch > - use container_of > --- > drivers/vfio/platform/vfio_platform_irq.c | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/drivers/vfio/platform/vfio_platform_irq.c b/drivers/vfio/platform/vfio_platform_irq.c > index efaee58..400a188 100644 > --- a/drivers/vfio/platform/vfio_platform_irq.c > +++ b/drivers/vfio/platform/vfio_platform_irq.c > @@ -224,23 +224,44 @@ static int vfio_platform_is_active(struct vfio_platform_irq *irq) > > static void vfio_platform_irq_bypass_stop(struct irq_bypass_producer *prod) > { > + disable_irq(prod->irq); > } > > static void vfio_platform_irq_bypass_start(struct irq_bypass_producer *prod) > { > + enable_irq(prod->irq); > } > > static int vfio_platform_irq_bypass_add_consumer( > struct irq_bypass_producer *prod, > struct irq_bypass_consumer *cons) > { > - return 0; > + struct vfio_platform_irq *irq = > + container_of(prod, struct vfio_platform_irq, producer); > + > + /* > + * if the IRQ is active at irqchip level or VFIO (auto)masked > + * this means the host IRQ is already under injection in the > + * guest and this not safe to change the forwarding state at > + * that stage. > + * It is not possible to differentiate user-space masking > + * from auto-masking, leading to possible false detection of > + * active state. > + */ > + if (vfio_platform_is_active(irq)) > + return -EAGAIN; Here's an example of why we don't want WARN_ON if a registration fails, this is effectively random. When and how is a re-try going to happen? > + > + return vfio_platform_set_automasked(irq, false); set_forwarded just seems so much more logical here. > } > > static void vfio_platform_irq_bypass_del_consumer( > struct irq_bypass_producer *prod, > struct irq_bypass_consumer *cons) > { > + struct vfio_platform_irq *irq = > + container_of(prod, struct vfio_platform_irq, producer); > + > + vfio_platform_set_automasked(irq, true); > } > > static int vfio_set_trigger(struct vfio_platform_device *vdev, int index, -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/