[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 3/8] vfio/pci: Split vfio_intx_update()
From: |
David Gibson |
Subject: |
[PULL 3/8] vfio/pci: Split vfio_intx_update() |
Date: |
Tue, 26 Nov 2019 17:01:46 +1100 |
This splits the vfio_intx_update() function into one part doing the actual
reconnection with the KVM irqchip (vfio_intx_update(), now taking an
argument with the new routing) and vfio_intx_routing_notifier() which
handles calls to the pci device intx routing notifier and calling
vfio_intx_update() when necessary. This will make adding support for the
irqchip change notifier easier.
Cc: Alex Williamson <address@hidden>
Cc: Alexey Kardashevskiy <address@hidden>
Signed-off-by: David Gibson <address@hidden>
Tested-by: Alex Williamson <address@hidden>
Reviewed-by: Alex Williamson <address@hidden>
Reviewed-by: Greg Kurz <address@hidden>
Acked-by: Alex Williamson <address@hidden>
---
hw/vfio/pci.c | 39 ++++++++++++++++++++++-----------------
1 file changed, 22 insertions(+), 17 deletions(-)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 0c55883bba..521289aa7d 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -216,30 +216,18 @@ static void vfio_intx_disable_kvm(VFIOPCIDevice *vdev)
#endif
}
-static void vfio_intx_update(PCIDevice *pdev)
+static void vfio_intx_update(VFIOPCIDevice *vdev, PCIINTxRoute *route)
{
- VFIOPCIDevice *vdev = PCI_VFIO(pdev);
- PCIINTxRoute route;
Error *err = NULL;
- if (vdev->interrupt != VFIO_INT_INTx) {
- return;
- }
-
- route = pci_device_route_intx_to_irq(&vdev->pdev, vdev->intx.pin);
-
- if (!pci_intx_route_changed(&vdev->intx.route, &route)) {
- return; /* Nothing changed */
- }
-
trace_vfio_intx_update(vdev->vbasedev.name,
- vdev->intx.route.irq, route.irq);
+ vdev->intx.route.irq, route->irq);
vfio_intx_disable_kvm(vdev);
- vdev->intx.route = route;
+ vdev->intx.route = *route;
- if (route.mode != PCI_INTX_ENABLED) {
+ if (route->mode != PCI_INTX_ENABLED) {
return;
}
@@ -252,6 +240,22 @@ static void vfio_intx_update(PCIDevice *pdev)
vfio_intx_eoi(&vdev->vbasedev);
}
+static void vfio_intx_routing_notifier(PCIDevice *pdev)
+{
+ VFIOPCIDevice *vdev = PCI_VFIO(pdev);
+ PCIINTxRoute route;
+
+ if (vdev->interrupt != VFIO_INT_INTx) {
+ return;
+ }
+
+ route = pci_device_route_intx_to_irq(&vdev->pdev, vdev->intx.pin);
+
+ if (pci_intx_route_changed(&vdev->intx.route, &route)) {
+ vfio_intx_update(vdev, &route);
+ }
+}
+
static int vfio_intx_enable(VFIOPCIDevice *vdev, Error **errp)
{
uint8_t pin = vfio_pci_read_config(&vdev->pdev, PCI_INTERRUPT_PIN, 1);
@@ -2967,7 +2971,8 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
if (vfio_pci_read_config(&vdev->pdev, PCI_INTERRUPT_PIN, 1)) {
vdev->intx.mmap_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL,
vfio_intx_mmap_enable, vdev);
- pci_device_set_intx_routing_notifier(&vdev->pdev, vfio_intx_update);
+ pci_device_set_intx_routing_notifier(&vdev->pdev,
+ vfio_intx_routing_notifier);
ret = vfio_intx_enable(vdev, errp);
if (ret) {
goto out_teardown;
--
2.23.0
- [PULL 0/8] ppc-for-4.2 queue 20191126, David Gibson, 2019/11/26
- [PULL 4/8] vfio/pci: Respond to KVM irqchip change notifier, David Gibson, 2019/11/26
- [PULL 8/8] ppc/spapr_events: fix potential NULL pointer dereference in rtas_event_log_dequeue, David Gibson, 2019/11/26
- [PULL 7/8] mos6522: update counters when timer interrupts are off, David Gibson, 2019/11/26
- [PULL 6/8] spapr: Work around spurious warnings from vfio INTx initialization, David Gibson, 2019/11/26
- [PULL 3/8] vfio/pci: Split vfio_intx_update(),
David Gibson <=
- [PULL 1/8] pseries: fix migration-test and pxe-test, David Gibson, 2019/11/26
- [PULL 5/8] spapr: Handle irq backend changes with VFIO PCI devices, David Gibson, 2019/11/26
- [PULL 2/8] kvm: Introduce KVM irqchip change notifier, David Gibson, 2019/11/26
- Re: [PULL 0/8] ppc-for-4.2 queue 20191126, Peter Maydell, 2019/11/26