提交 6d7425f1 编写于 作者: F Feng Wu 提交者: Paolo Bonzini

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: NAlex Williamson <alex.williamson@redhat.com>
Signed-off-by: NFeng Wu <feng.wu@intel.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 d84f1e07
...@@ -33,3 +33,4 @@ menuconfig VFIO ...@@ -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"
...@@ -2,6 +2,7 @@ config VFIO_PCI ...@@ -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.
......
...@@ -319,6 +319,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, ...@@ -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, ...@@ -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;
......
...@@ -13,6 +13,7 @@ ...@@ -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 { ...@@ -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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册