|
@@ -366,6 +366,17 @@ static int vfio_intx_enable(struct vfio_pci_device *vdev)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
vdev->num_ctx = 1;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the virtual interrupt is masked, restore it. Devices
|
|
|
+ * supporting DisINTx can be masked at the hardware level
|
|
|
+ * here, non-PCI-2.3 devices will have to wait until the
|
|
|
+ * interrupt is enabled.
|
|
|
+ */
|
|
|
+ vdev->ctx[0].masked = vdev->virq_disabled;
|
|
|
+ if (vdev->pci_2_3)
|
|
|
+ pci_intx(vdev->pdev, !vdev->ctx[0].masked);
|
|
|
+
|
|
|
vdev->irq_type = VFIO_PCI_INTX_IRQ_INDEX;
|
|
|
|
|
|
return 0;
|
|
@@ -419,7 +430,7 @@ static int vfio_intx_set_signal(struct vfio_pci_device *vdev, int fd)
|
|
|
* disable_irq won't.
|
|
|
*/
|
|
|
spin_lock_irqsave(&vdev->irqlock, flags);
|
|
|
- if (!vdev->pci_2_3 && (vdev->ctx[0].masked || vdev->virq_disabled))
|
|
|
+ if (!vdev->pci_2_3 && vdev->ctx[0].masked)
|
|
|
disable_irq_nosync(pdev->irq);
|
|
|
spin_unlock_irqrestore(&vdev->irqlock, flags);
|
|
|
|