From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751498AbdE3MqF (ORCPT ); Tue, 30 May 2017 08:46:05 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56680 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750925AbdE3MqD (ORCPT ); Tue, 30 May 2017 08:46:03 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3BA71285B1 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eric.auger@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3BA71285B1 Subject: Re: [PATCH 01/10] vfio: platform: Add automasked field to vfio_platform_irq To: Marc Zyngier References: <1495656803-28011-1-git-send-email-eric.auger@redhat.com> <1495656803-28011-2-git-send-email-eric.auger@redhat.com> <87fufslsmm.fsf@arm.com> Cc: eric.auger.pro@gmail.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, alex.williamson@redhat.com, pbonzini@redhat.com, christoffer.dall@linaro.org, drjones@redhat.com, wei@redhat.com From: Auger Eric Message-ID: <3bc73d5c-4830-3bf5-ae59-d88ebdab8c27@redhat.com> Date: Tue, 30 May 2017 14:45:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <87fufslsmm.fsf@arm.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 30 May 2017 12:46:03 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Marc, On 25/05/2017 20:05, Marc Zyngier wrote: > Hi Eric, > > On Wed, May 24 2017 at 10:13:14 pm BST, 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/platform/vfio_platform_irq.c | 10 ++++++---- >> drivers/vfio/platform/vfio_platform_private.h | 1 + >> 2 files changed, 7 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/vfio/platform/vfio_platform_irq.c b/drivers/vfio/platform/vfio_platform_irq.c >> index 46d4750..831f0b0 100644 >> --- a/drivers/vfio/platform/vfio_platform_irq.c >> +++ b/drivers/vfio/platform/vfio_platform_irq.c >> @@ -29,7 +29,7 @@ static void vfio_platform_mask(struct vfio_platform_irq *irq_ctx) >> >> spin_lock_irqsave(&irq_ctx->lock, flags); >> >> - if (!irq_ctx->masked) { >> + if (!irq_ctx->masked && !irq_ctx->automasked) { > > Could you please expand a bit on what this automasked variable covers? > It'd be good to document how masked and automasked differ in behaviour. Yes sure. So automasked is set by the physical IRQ handler only, for level sensitive IRQ (AUTOMASKED interrupts). masked is set through the userspace API (VFIO_DEVICE_SET_IRQS and ACTION_MASK) when masking the IRQ. VFIO ACTION_UNMASK resets both. > > Also, it may be worth having a helper (is_masked?) to abstract both > cases. Sure Eric > >> disable_irq_nosync(irq_ctx->hwirq); >> irq_ctx->masked = true; >> } >> @@ -89,9 +89,10 @@ static void vfio_platform_unmask(struct vfio_platform_irq *irq_ctx) >> >> spin_lock_irqsave(&irq_ctx->lock, flags); >> >> - if (irq_ctx->masked) { >> + if (irq_ctx->masked || irq_ctx->automasked) { >> enable_irq(irq_ctx->hwirq); >> irq_ctx->masked = false; >> + irq_ctx->automasked = false; >> } >> >> spin_unlock_irqrestore(&irq_ctx->lock, flags); >> @@ -152,12 +153,12 @@ static irqreturn_t vfio_automasked_irq_handler(int irq, void *dev_id) >> >> spin_lock_irqsave(&irq_ctx->lock, flags); >> >> - if (!irq_ctx->masked) { >> + if (!irq_ctx->masked && !irq_ctx->automasked) { >> ret = IRQ_HANDLED; >> >> /* automask maskable interrupts */ >> disable_irq_nosync(irq_ctx->hwirq); >> - irq_ctx->masked = true; >> + irq_ctx->automasked = true; >> } >> >> spin_unlock_irqrestore(&irq_ctx->lock, flags); >> @@ -315,6 +316,7 @@ int vfio_platform_irq_init(struct vfio_platform_device *vdev) >> vdev->irqs[i].count = 1; >> vdev->irqs[i].hwirq = hwirq; >> vdev->irqs[i].masked = false; >> + vdev->irqs[i].automasked = false; >> } >> >> vdev->num_irqs = cnt; >> diff --git a/drivers/vfio/platform/vfio_platform_private.h b/drivers/vfio/platform/vfio_platform_private.h >> index 85ffe5d..8a3cfa9 100644 >> --- a/drivers/vfio/platform/vfio_platform_private.h >> +++ b/drivers/vfio/platform/vfio_platform_private.h >> @@ -34,6 +34,7 @@ struct vfio_platform_irq { >> char *name; >> struct eventfd_ctx *trigger; >> bool masked; >> + bool automasked; >> spinlock_t lock; >> struct virqfd *unmask; >> struct virqfd *mask; > > Thanks, > > M. >