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>
This commit is contained in:
Feng Wu 2015-09-18 22:29:50 +08:00 committed by Paolo Bonzini
parent d84f1e0755
commit 6d7425f109
4 changed files with 13 additions and 0 deletions

View File

@ -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"

View File

@ -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.

View File

@ -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;

View File

@ -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 {