Blame 0118-vfio-pci-Don-t-remove-irqchip-notifier-if-not-regist.patch

Fabiano Fidêncio 492d6c
From 0446f8121723b134ca1d1ed0b73e96d4a0a8689d Mon Sep 17 00:00:00 2001
Fabiano Fidêncio 492d6c
From: Peter Xu <peterx@redhat.com>
Fabiano Fidêncio 492d6c
Date: Mon, 6 Jan 2020 13:34:45 -0700
Fabiano Fidêncio 492d6c
Subject: [PATCH] vfio/pci: Don't remove irqchip notifier if not registered
Fabiano Fidêncio 492d6c
Fabiano Fidêncio 492d6c
The kvm irqchip notifier is only registered if the device supports
Fabiano Fidêncio 492d6c
INTx, however it's unconditionally removed.  If the assigned device
Fabiano Fidêncio 492d6c
does not support INTx, this will cause QEMU to crash when unplugging
Fabiano Fidêncio 492d6c
the device from the system.  Change it to conditionally remove the
Fabiano Fidêncio 492d6c
notifier only if the notify hook is setup.
Fabiano Fidêncio 492d6c
Fabiano Fidêncio 492d6c
CC: Eduardo Habkost <ehabkost@redhat.com>
Fabiano Fidêncio 492d6c
CC: David Gibson <david@gibson.dropbear.id.au>
Fabiano Fidêncio 492d6c
CC: Alex Williamson <alex.williamson@redhat.com>
Fabiano Fidêncio 492d6c
Cc: qemu-stable@nongnu.org # v4.2
Fabiano Fidêncio 492d6c
Reported-by: yanghliu@redhat.com
Fabiano Fidêncio 492d6c
Debugged-by: Eduardo Habkost <ehabkost@redhat.com>
Fabiano Fidêncio 492d6c
Fixes: c5478fea27ac ("vfio/pci: Respond to KVM irqchip change notifier")
Fabiano Fidêncio 492d6c
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1782678
Fabiano Fidêncio 492d6c
Signed-off-by: Peter Xu <peterx@redhat.com>
Fabiano Fidêncio 492d6c
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Fabiano Fidêncio 492d6c
Reviewed-by: Greg Kurz <groug@kaod.org>
Fabiano Fidêncio 492d6c
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Fabiano Fidêncio 492d6c
---
Fabiano Fidêncio 492d6c
 hw/vfio/pci.c | 4 +++-
Fabiano Fidêncio 492d6c
 1 file changed, 3 insertions(+), 1 deletion(-)
Fabiano Fidêncio 492d6c
Fabiano Fidêncio 492d6c
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
Fabiano Fidêncio 492d6c
index 2d40b396f2..337a173ce7 100644
Fabiano Fidêncio 492d6c
--- a/hw/vfio/pci.c
Fabiano Fidêncio 492d6c
+++ b/hw/vfio/pci.c
Fabiano Fidêncio 492d6c
@@ -3076,7 +3076,9 @@ static void vfio_exitfn(PCIDevice *pdev)
Fabiano Fidêncio 492d6c
     vfio_unregister_req_notifier(vdev);
Fabiano Fidêncio 492d6c
     vfio_unregister_err_notifier(vdev);
Fabiano Fidêncio 492d6c
     pci_device_set_intx_routing_notifier(&vdev->pdev, NULL);
Fabiano Fidêncio 492d6c
-    kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier);
Fabiano Fidêncio 492d6c
+    if (vdev->irqchip_change_notifier.notify) {
Fabiano Fidêncio 492d6c
+        kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier);
Fabiano Fidêncio 492d6c
+    }
Fabiano Fidêncio 492d6c
     vfio_disable_interrupts(vdev);
Fabiano Fidêncio 492d6c
     if (vdev->intx.mmap_timer) {
Fabiano Fidêncio 492d6c
         timer_free(vdev->intx.mmap_timer);
Fabiano Fidêncio 492d6c
-- 
Fabiano Fidêncio 492d6c
2.25.1
Fabiano Fidêncio 492d6c