Message ID | 20230629084042.86502-2-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | VFIO migration related refactor and bug fix | expand |
On 29/06/2023 09:40, Zhenzhong Duan wrote: > The kvm irqchip notifier is only registered if the device supports > INTx, however it's unconditionally removed in vfio realize error > path. If the assigned device does not support INTx, this will cause > QEMU to crash when vfio realize fails. Change it to conditionally > remove the notifier only if the notify hook is setup. > > Before fix: > (qemu) device_add vfio-pci,host=81:11.1,id=vfio1,bus=root1,xres=1 > Connection closed by foreign host. > > After fix: > (qemu) device_add vfio-pci,host=81:11.1,id=vfio1,bus=root1,xres=1 > Error: vfio 0000:81:11.1: xres and yres properties require display=on > (qemu) > > Fixes: c5478fea27ac ("vfio/pci: Respond to KVM irqchip change notifier") > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Reviewed-by: Joao Martins <joao.m.martins@oracle.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 73e19a04b2bf..48df517f79ee 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -3221,7 +3221,9 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > > out_deregister: > 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); > + } > out_teardown: > vfio_teardown_msi(vdev); > vfio_bars_exit(vdev);
On 6/29/23 10:40, Zhenzhong Duan wrote: > The kvm irqchip notifier is only registered if the device supports > INTx, however it's unconditionally removed in vfio realize error > path. If the assigned device does not support INTx, this will cause > QEMU to crash when vfio realize fails. Change it to conditionally > remove the notifier only if the notify hook is setup. > > Before fix: > (qemu) device_add vfio-pci,host=81:11.1,id=vfio1,bus=root1,xres=1 > Connection closed by foreign host. > > After fix: > (qemu) device_add vfio-pci,host=81:11.1,id=vfio1,bus=root1,xres=1 > Error: vfio 0000:81:11.1: xres and yres properties require display=on > (qemu) > > Fixes: c5478fea27ac ("vfio/pci: Respond to KVM irqchip change notifier") > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > 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 73e19a04b2bf..48df517f79ee 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -3221,7 +3221,9 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > > out_deregister: > 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); > + } > out_teardown: > vfio_teardown_msi(vdev); > vfio_bars_exit(vdev);
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 73e19a04b2bf..48df517f79ee 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3221,7 +3221,9 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) out_deregister: 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); + } out_teardown: vfio_teardown_msi(vdev); vfio_bars_exit(vdev);
The kvm irqchip notifier is only registered if the device supports INTx, however it's unconditionally removed in vfio realize error path. If the assigned device does not support INTx, this will cause QEMU to crash when vfio realize fails. Change it to conditionally remove the notifier only if the notify hook is setup. Before fix: (qemu) device_add vfio-pci,host=81:11.1,id=vfio1,bus=root1,xres=1 Connection closed by foreign host. After fix: (qemu) device_add vfio-pci,host=81:11.1,id=vfio1,bus=root1,xres=1 Error: vfio 0000:81:11.1: xres and yres properties require display=on (qemu) Fixes: c5478fea27ac ("vfio/pci: Respond to KVM irqchip change notifier") Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- hw/vfio/pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)