diff mbox series

vfio/pci: Clear token on bypass registration failure

Message ID 160311419702.25406.2436004222669241097.stgit@gimli.home
State New, archived
Headers show
Series vfio/pci: Clear token on bypass registration failure | expand

Commit Message

Alex Williamson Oct. 19, 2020, 1:30 p.m. UTC
The eventfd context is used as our irqbypass token, therefore if an
eventfd is re-used, our token is the same.  The irqbypass code will
return an -EBUSY in this case, but we'll still attempt to unregister
the producer, where if that duplicate token still exists, results in
removing the wrong object.  Clear the token of failed producers so
that they harmlessly fall out when unregistered.

Fixes: 6d7425f109d2 ("vfio: Register/unregister irq_bypass_producer")
Reported-by: guomin chen <guomin_chen@sina.com>
Tested-by: guomin chen <guomin_chen@sina.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---
 drivers/vfio/pci/vfio_pci_intrs.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

gchen chen Nov. 11, 2020, 2:15 a.m. UTC | #1
Thanks a lot.

Alex Williamson <alex.williamson@redhat.com> 于2020年10月19日周一 下午9:30写道:
>
> The eventfd context is used as our irqbypass token, therefore if an
> eventfd is re-used, our token is the same.  The irqbypass code will
> return an -EBUSY in this case, but we'll still attempt to unregister
> the producer, where if that duplicate token still exists, results in
> removing the wrong object.  Clear the token of failed producers so
> that they harmlessly fall out when unregistered.
>
> Fixes: 6d7425f109d2 ("vfio: Register/unregister irq_bypass_producer")
> Reported-by: guomin chen <guomin_chen@sina.com>
> Tested-by: guomin chen <guomin_chen@sina.com>
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
> ---
>  drivers/vfio/pci/vfio_pci_intrs.c |    4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
> index 1d9fb2592945..869dce5f134d 100644
> --- a/drivers/vfio/pci/vfio_pci_intrs.c
> +++ b/drivers/vfio/pci/vfio_pci_intrs.c
> @@ -352,11 +352,13 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
>         vdev->ctx[vector].producer.token = trigger;
>         vdev->ctx[vector].producer.irq = irq;
>         ret = irq_bypass_register_producer(&vdev->ctx[vector].producer);
> -       if (unlikely(ret))
> +       if (unlikely(ret)) {
>                 dev_info(&pdev->dev,
>                 "irq bypass producer (token %p) registration fails: %d\n",
>                 vdev->ctx[vector].producer.token, ret);
>
> +               vdev->ctx[vector].producer.token = NULL;
> +       }
>         vdev->ctx[vector].trigger = trigger;
>
>         return 0;
>
diff mbox series

Patch

diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
index 1d9fb2592945..869dce5f134d 100644
--- a/drivers/vfio/pci/vfio_pci_intrs.c
+++ b/drivers/vfio/pci/vfio_pci_intrs.c
@@ -352,11 +352,13 @@  static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
 	vdev->ctx[vector].producer.token = trigger;
 	vdev->ctx[vector].producer.irq = irq;
 	ret = irq_bypass_register_producer(&vdev->ctx[vector].producer);
-	if (unlikely(ret))
+	if (unlikely(ret)) {
 		dev_info(&pdev->dev,
 		"irq bypass producer (token %p) registration fails: %d\n",
 		vdev->ctx[vector].producer.token, ret);
 
+		vdev->ctx[vector].producer.token = NULL;
+	}
 	vdev->ctx[vector].trigger = trigger;
 
 	return 0;