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