vfio: Register/unregister irq_bypass_producer
authorFeng Wu <feng.wu@intel.com>
Fri, 18 Sep 2015 14:29:50 +0000 (22:29 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 1 Oct 2015 13:06:50 +0000 (15:06 +0200)
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>
drivers/vfio/Kconfig
drivers/vfio/pci/Kconfig
drivers/vfio/pci/vfio_pci_intrs.c
drivers/vfio/pci/vfio_pci_private.h

index 454017928ed030a776d2aefd84ac661f829b05b9..850d86ca685b273344271eda7c95ad4f82b28244 100644 (file)
@@ -33,3 +33,4 @@ menuconfig VFIO
 
 source "drivers/vfio/pci/Kconfig"
 source "drivers/vfio/platform/Kconfig"
+source "virt/lib/Kconfig"
index 579d83bf53583f53966a01bd299e4f31a08c2bd7..02912f180c6da1fa7facef4f73ffa9c69c89ead2 100644 (file)
@@ -2,6 +2,7 @@ config VFIO_PCI
        tristate "VFIO support for PCI devices"
        depends on VFIO && PCI && EVENTFD
        select VFIO_VIRQFD
+       select IRQ_BYPASS_MANAGER
        help
          Support for the PCI VFIO bus driver.  This is required to make
          use of PCI drivers using the VFIO framework.
index 1f577b4ac126029d2b7664b3380f25a9a1e4b267..3b3ba15558b73dbb612228791ae89478644f8096 100644 (file)
@@ -319,6 +319,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
 
        if (vdev->ctx[vector].trigger) {
                free_irq(irq, vdev->ctx[vector].trigger);
+               irq_bypass_unregister_producer(&vdev->ctx[vector].producer);
                kfree(vdev->ctx[vector].name);
                eventfd_ctx_put(vdev->ctx[vector].trigger);
                vdev->ctx[vector].trigger = NULL;
@@ -360,6 +361,14 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
                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;
 
        return 0;
index ae0e1b4c17114ab7cdea64b49330789409feb707..0e7394f8f69bca32bd60f05bb013cbb4eea1dbc2 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/mutex.h>
 #include <linux/pci.h>
+#include <linux/irqbypass.h>
 
 #ifndef VFIO_PCI_PRIVATE_H
 #define VFIO_PCI_PRIVATE_H
@@ -29,6 +30,7 @@ struct vfio_pci_irq_ctx {
        struct virqfd           *mask;
        char                    *name;
        bool                    masked;
+       struct irq_bypass_producer      producer;
 };
 
 struct vfio_pci_device {