Message ID | 160311419702.25406.2436004222669241097.stgit@gimli.home (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio/pci: Clear token on bypass registration failure | expand |
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 --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;