Thanks a lot. Alex Williamson <alex.williamson@xxxxxxxxxx> 于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@xxxxxxxx> > Tested-by: guomin chen <guomin_chen@xxxxxxxx> > Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx> > --- > 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; >