Hi, On 11/27/19 5:49 PM, Jiang Yi wrote: > Since irq_bypass_register_producer() is called after request_irq(), we > should do tear-down in reverse order: irq_bypass_unregister_producer() > then free_irq(). > > Signed-off-by: Jiang Yi <giangyi@xxxxxxxxxx> > --- > drivers/vfio/pci/vfio_pci_intrs.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 3fa3f728fb39..2056f3f85f59 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -289,18 +289,18 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, > int irq, ret; > > if (vector < 0 || vector >= vdev->num_ctx) > return -EINVAL; > > irq = pci_irq_vector(pdev, vector); > > if (vdev->ctx[vector].trigger) { > - free_irq(irq, vdev->ctx[vector].trigger); > irq_bypass_unregister_producer(&vdev->ctx[vector].producer); > + free_irq(irq, vdev->ctx[vector].trigger); Looks the right way too Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> May be worth checking it does not alter the x86 posted interrupt setup though. update_pi_irte() gets called. I was concerned about the fact the interrupts may be enabled when doing the unregistration (TBC). The irq_bypass framework offers producer start/stop callbacks that would allow to handle this but nobody use them atm. Thanks Eric > kfree(vdev->ctx[vector].name); > eventfd_ctx_put(vdev->ctx[vector].trigger); > vdev->ctx[vector].trigger = NULL; > } > > if (fd < 0) > return 0; > >