]> Git Repo - J-linux.git/commitdiff
vfio/pci: Clear token on bypass registration failure
authorAlex Williamson <[email protected]>
Mon, 19 Oct 2020 13:13:55 +0000 (07:13 -0600)
committerAlex Williamson <[email protected]>
Mon, 19 Oct 2020 13:13:55 +0000 (07:13 -0600)
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 <[email protected]>
Tested-by: guomin chen <[email protected]>
Signed-off-by: Alex Williamson <[email protected]>
drivers/vfio/pci/vfio_pci_intrs.c

index 1d9fb25929459e212e22a3543c27faf70d6cd6af..869dce5f134dd5d4a594ac1a706b706161583f77 100644 (file)
@@ -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;
This page took 0.051606 seconds and 4 git commands to generate.