This reverts commit e31eb60c4288ecbb4cc447a8e2496ea758a3984e.
This is a bad backport, it pulls in an unnecessary dependency in commit b8e81e269b3d ("vfio/pci: Prepare for dynamic interrupt context storage") which turns out to be broken on it's own.
Revert and start over.
Signed-off-by: Alex Williamson alex.williamson@redhat.com --- drivers/vfio/pci/vfio_pci_intrs.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c index 0deb51c820d2..ef63ee441c36 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -319,15 +319,8 @@ static int vfio_intx_set_signal(struct vfio_pci_core_device *vdev, int fd)
ctx->trigger = trigger;
- /* - * Devices without DisINTx support require an exclusive interrupt, - * IRQ masking is performed at the IRQ chip. The masked status is - * protected by vdev->irqlock. Setup the IRQ without auto-enable and - * unmask as necessary below under lock. DisINTx is unmodified by - * the IRQ configuration and may therefore use auto-enable. - */ if (!vdev->pci_2_3) - irqflags = IRQF_NO_AUTOEN; + irqflags = 0;
ret = request_irq(pdev->irq, vfio_intx_handler, irqflags, ctx->name, vdev); @@ -338,9 +331,13 @@ static int vfio_intx_set_signal(struct vfio_pci_core_device *vdev, int fd) return ret; }
+ /* + * INTx disable will stick across the new irq setup, + * disable_irq won't. + */ spin_lock_irqsave(&vdev->irqlock, flags); - if (!vdev->pci_2_3 && !ctx->masked) - enable_irq(pdev->irq); + if (!vdev->pci_2_3 && ctx->masked) + disable_irq_nosync(pdev->irq); spin_unlock_irqrestore(&vdev->irqlock, flags);
return 0;