mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
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:
parent
d84f1e0755
commit
6d7425f109
@ -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
|
|||||||
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,
|
|||||||
|
|
||||||
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;
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user