[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <532d5a85-f74f-4e4d-a0fa-f8363910786d@redhat.com>
Date: Mon, 11 Mar 2024 10:29:55 +0100
From: Eric Auger <eric.auger@...hat.com>
To: Alex Williamson <alex.williamson@...hat.com>
Cc: kvm@...r.kernel.org, clg@...hat.com, reinette.chatre@...el.com,
linux-kernel@...r.kernel.org, kevin.tian@...el.com,
diana.craciun@....nxp.com, stable@...r.kernel.org
Subject: Re: [PATCH v2 7/7] vfio/fsl-mc: Block calling interrupt handler
without trigger
Hi Alex,
On 3/9/24 00:05, Alex Williamson wrote:
> The eventfd_ctx trigger pointer of the vfio_fsl_mc_irq object is
> initially NULL and may become NULL if the user sets the trigger
> eventfd to -1. The interrupt handler itself is guaranteed that
> trigger is always valid between request_irq() and free_irq(), but
> the loopback testing mechanisms to invoke the handler function
> need to test the trigger. The triggering and setting ioctl paths
> both make use of igate and are therefore mutually exclusive.
>
> The vfio-fsl-mc driver does not make use of irqfds, nor does it
> support any sort of masking operations, therefore unlike vfio-pci
> and vfio-platform, the flow can remain essentially unchanged.
>
> Cc: Diana Craciun <diana.craciun@....nxp.com>
> Cc: stable@...r.kernel.org
> Fixes: cc0ee20bd969 ("vfio/fsl-mc: trigger an interrupt via eventfd")
> Signed-off-by: Alex Williamson <alex.williamson@...hat.com>
Reviewed-by: Eric Auger <eric.auger@...hat.com>
Eric
> ---
> drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
> index d62fbfff20b8..82b2afa9b7e3 100644
> --- a/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
> +++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
> @@ -141,13 +141,14 @@ static int vfio_fsl_mc_set_irq_trigger(struct vfio_fsl_mc_device *vdev,
> irq = &vdev->mc_irqs[index];
>
> if (flags & VFIO_IRQ_SET_DATA_NONE) {
> - vfio_fsl_mc_irq_handler(hwirq, irq);
> + if (irq->trigger)
> + eventfd_signal(irq->trigger);
>
> } else if (flags & VFIO_IRQ_SET_DATA_BOOL) {
> u8 trigger = *(u8 *)data;
>
> - if (trigger)
> - vfio_fsl_mc_irq_handler(hwirq, irq);
> + if (trigger && irq->trigger)
> + eventfd_signal(irq->trigger);
> }
>
> return 0;
Powered by blists - more mailing lists