Message ID | 20240306211445.1856768-6-alex.williamson@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio: Interrupt eventfd hardening | expand |
> From: Alex Williamson <alex.williamson@redhat.com> > Sent: Thursday, March 7, 2024 5:15 AM > > @@ -321,8 +321,13 @@ void vfio_platform_irq_cleanup(struct > vfio_platform_device *vdev) > { > int i; > > - for (i = 0; i < vdev->num_irqs; i++) > + for (i = 0; i < vdev->num_irqs; i++) { > + int hwirq = vdev->get_irq(vdev, i); hwirq is unused. > + > + vfio_virqfd_disable(&vdev->irqs[i].mask); > + vfio_virqfd_disable(&vdev->irqs[i].unmask); > vfio_set_trigger(vdev, i, -1, NULL); > + } > > vdev->num_irqs = 0; > kfree(vdev->irqs); > -- > 2.43.2
On Fri, 8 Mar 2024 07:16:02 +0000 "Tian, Kevin" <kevin.tian@intel.com> wrote: > > From: Alex Williamson <alex.williamson@redhat.com> > > Sent: Thursday, March 7, 2024 5:15 AM > > > > @@ -321,8 +321,13 @@ void vfio_platform_irq_cleanup(struct > > vfio_platform_device *vdev) > > { > > int i; > > > > - for (i = 0; i < vdev->num_irqs; i++) > > + for (i = 0; i < vdev->num_irqs; i++) { > > + int hwirq = vdev->get_irq(vdev, i); > > hwirq is unused. Yep, poor split with the next patch. I'll update the next patch to use vdev->irqs[i].hwirq here and in the unwind on init to avoid this. Thanks, Alex > > + > > + vfio_virqfd_disable(&vdev->irqs[i].mask); > > + vfio_virqfd_disable(&vdev->irqs[i].unmask); > > vfio_set_trigger(vdev, i, -1, NULL); > > + } > > > > vdev->num_irqs = 0; > > kfree(vdev->irqs); > > -- > > 2.43.2 >
diff --git a/drivers/vfio/platform/vfio_platform_irq.c b/drivers/vfio/platform/vfio_platform_irq.c index 61a1bfb68ac7..a311d70c695b 100644 --- a/drivers/vfio/platform/vfio_platform_irq.c +++ b/drivers/vfio/platform/vfio_platform_irq.c @@ -321,8 +321,13 @@ void vfio_platform_irq_cleanup(struct vfio_platform_device *vdev) { int i; - for (i = 0; i < vdev->num_irqs; i++) + for (i = 0; i < vdev->num_irqs; i++) { + int hwirq = vdev->get_irq(vdev, i); + + vfio_virqfd_disable(&vdev->irqs[i].mask); + vfio_virqfd_disable(&vdev->irqs[i].unmask); vfio_set_trigger(vdev, i, -1, NULL); + } vdev->num_irqs = 0; kfree(vdev->irqs);
irqfds for mask and unmask that are not specifically disabled by the user are leaked. Remove any irqfds during cleanup Cc: Eric Auger <eric.auger@redhat.com> Fixes: a7fa7c77cf15 ("vfio/platform: implement IRQ masking/unmasking via an eventfd") Signed-off-by: Alex Williamson <alex.williamson@redhat.com> --- drivers/vfio/platform/vfio_platform_irq.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)