Эх сурвалжийг харах

vfio: Register/unregister irq_bypass_producer

This patch adds the registration/unregistration of an
irq_bypass_producer for MSI/MSIx on vfio pci devices.

Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Feng Wu <feng.wu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Feng Wu 10 жил өмнө
parent
commit
6d7425f109

+ 1 - 0
drivers/vfio/Kconfig

@@ -33,3 +33,4 @@ menuconfig VFIO
 
 
 source "drivers/vfio/pci/Kconfig"
 source "drivers/vfio/pci/Kconfig"
 source "drivers/vfio/platform/Kconfig"
 source "drivers/vfio/platform/Kconfig"
+source "virt/lib/Kconfig"

+ 1 - 0
drivers/vfio/pci/Kconfig

@@ -2,6 +2,7 @@ config VFIO_PCI
 	tristate "VFIO support for PCI devices"
 	tristate "VFIO support for PCI devices"
 	depends on VFIO && PCI && EVENTFD
 	depends on VFIO && PCI && EVENTFD
 	select VFIO_VIRQFD
 	select VFIO_VIRQFD
+	select IRQ_BYPASS_MANAGER
 	help
 	help
 	  Support for the PCI VFIO bus driver.  This is required to make
 	  Support for the PCI VFIO bus driver.  This is required to make
 	  use of PCI drivers using the VFIO framework.
 	  use of PCI drivers using the VFIO framework.

+ 9 - 0
drivers/vfio/pci/vfio_pci_intrs.c

@@ -319,6 +319,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
 
 
 	if (vdev->ctx[vector].trigger) {
 	if (vdev->ctx[vector].trigger) {
 		free_irq(irq, vdev->ctx[vector].trigger);
 		free_irq(irq, vdev->ctx[vector].trigger);
+		irq_bypass_unregister_producer(&vdev->ctx[vector].producer);
 		kfree(vdev->ctx[vector].name);
 		kfree(vdev->ctx[vector].name);
 		eventfd_ctx_put(vdev->ctx[vector].trigger);
 		eventfd_ctx_put(vdev->ctx[vector].trigger);
 		vdev->ctx[vector].trigger = NULL;
 		vdev->ctx[vector].trigger = NULL;
@@ -360,6 +361,14 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
 		return ret;
 		return ret;
 	}
 	}
 
 
+	vdev->ctx[vector].producer.token = trigger;
+	vdev->ctx[vector].producer.irq = irq;
+	ret = irq_bypass_register_producer(&vdev->ctx[vector].producer);
+	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].trigger = trigger;
 	vdev->ctx[vector].trigger = trigger;
 
 
 	return 0;
 	return 0;

+ 2 - 0
drivers/vfio/pci/vfio_pci_private.h

@@ -13,6 +13,7 @@
 
 
 #include <linux/mutex.h>
 #include <linux/mutex.h>
 #include <linux/pci.h>
 #include <linux/pci.h>
+#include <linux/irqbypass.h>
 
 
 #ifndef VFIO_PCI_PRIVATE_H
 #ifndef VFIO_PCI_PRIVATE_H
 #define VFIO_PCI_PRIVATE_H
 #define VFIO_PCI_PRIVATE_H
@@ -29,6 +30,7 @@ struct vfio_pci_irq_ctx {
 	struct virqfd		*mask;
 	struct virqfd		*mask;
 	char			*name;
 	char			*name;
 	bool			masked;
 	bool			masked;
+	struct irq_bypass_producer	producer;
 };
 };
 
 
 struct vfio_pci_device {
 struct vfio_pci_device {