Message ID | 1589999088-31477-18-git-send-email-kwankhede@nvidia.com |
---|---|
State | New |
Headers | show |
Series | Add migration support for VFIO devices | expand |
* Kirti Wankhede (kwankhede@nvidia.com) wrote: > If device is not failover primary device call vfio_migration_probe() > and vfio_migration_finalize() functions for vfio-pci device to enable > migration for vfio PCI device which support migration. > Removed vfio_pci_vmstate structure. > Removed migration blocker from VFIO PCI device specific structure and use > migration blocker from generic structure of VFIO device. > > Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com> > Reviewed-by: Neo Jia <cjia@nvidia.com> > --- > hw/vfio/pci.c | 32 +++++++++++--------------------- > hw/vfio/pci.h | 1 - > 2 files changed, 11 insertions(+), 22 deletions(-) > > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index 94535f0e27cd..573b28753bfd 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2916,22 +2916,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > return; > } > > - if (!pdev->failover_pair_id) { > - error_setg(&vdev->migration_blocker, > - "VFIO device doesn't support migration"); > - ret = migrate_add_blocker(vdev->migration_blocker, &err); > - if (ret) { > - error_propagate(errp, err); > - error_free(vdev->migration_blocker); > - vdev->migration_blocker = NULL; > - return; > - } > - } > - > vdev->vbasedev.name = g_path_get_basename(vdev->vbasedev.sysfsdev); > vdev->vbasedev.ops = &vfio_pci_ops; > vdev->vbasedev.type = VFIO_DEVICE_TYPE_PCI; > vdev->vbasedev.dev = DEVICE(vdev); > + vdev->vbasedev.device_state = 0; > > tmp = g_strdup_printf("%s/iommu_group", vdev->vbasedev.sysfsdev); > len = readlink(tmp, group_path, sizeof(group_path)); > @@ -3195,6 +3184,14 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > } > } > > + if (!pdev->failover_pair_id) { > + ret = vfio_migration_probe(&vdev->vbasedev, errp); OK, and I can see vfio_migration_probe adds a blocker if the device doesn't support migration. > + if (ret) { > + error_report("%s: Failed to setup for migration", > + vdev->vbasedev.name); > + } > + } > + > vfio_register_err_notifier(vdev); > vfio_register_req_notifier(vdev); > vfio_setup_resetfn_quirk(vdev); > @@ -3209,11 +3206,6 @@ out_teardown: > vfio_bars_exit(vdev); > error: > error_prepend(errp, VFIO_MSG_PREFIX, vdev->vbasedev.name); > - if (vdev->migration_blocker) { > - migrate_del_blocker(vdev->migration_blocker); > - error_free(vdev->migration_blocker); > - vdev->migration_blocker = NULL; > - } > } > > static void vfio_instance_finalize(Object *obj) > @@ -3225,10 +3217,7 @@ static void vfio_instance_finalize(Object *obj) > vfio_bars_finalize(vdev); > g_free(vdev->emulated_config_bits); > g_free(vdev->rom); > - if (vdev->migration_blocker) { > - migrate_del_blocker(vdev->migration_blocker); > - error_free(vdev->migration_blocker); > - } > + > /* > * XXX Leaking igd_opregion is not an oversight, we can't remove the > * fw_cfg entry therefore leaking this allocation seems like the safest > @@ -3256,6 +3245,7 @@ static void vfio_exitfn(PCIDevice *pdev) > } > vfio_teardown_msi(vdev); > vfio_bars_exit(vdev); > + vfio_migration_finalize(&vdev->vbasedev); Which this removes at the end. So, Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> > } > > static void vfio_pci_reset(DeviceState *dev) > diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h > index 0da7a20a7ec2..b148c937ef72 100644 > --- a/hw/vfio/pci.h > +++ b/hw/vfio/pci.h > @@ -168,7 +168,6 @@ typedef struct VFIOPCIDevice { > bool no_vfio_ioeventfd; > bool enable_ramfb; > VFIODisplay *dpy; > - Error *migration_blocker; > Notifier irqchip_change_notifier; > } VFIOPCIDevice; > > -- > 2.7.0 > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 94535f0e27cd..573b28753bfd 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -2916,22 +2916,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) return; } - if (!pdev->failover_pair_id) { - error_setg(&vdev->migration_blocker, - "VFIO device doesn't support migration"); - ret = migrate_add_blocker(vdev->migration_blocker, &err); - if (ret) { - error_propagate(errp, err); - error_free(vdev->migration_blocker); - vdev->migration_blocker = NULL; - return; - } - } - vdev->vbasedev.name = g_path_get_basename(vdev->vbasedev.sysfsdev); vdev->vbasedev.ops = &vfio_pci_ops; vdev->vbasedev.type = VFIO_DEVICE_TYPE_PCI; vdev->vbasedev.dev = DEVICE(vdev); + vdev->vbasedev.device_state = 0; tmp = g_strdup_printf("%s/iommu_group", vdev->vbasedev.sysfsdev); len = readlink(tmp, group_path, sizeof(group_path)); @@ -3195,6 +3184,14 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) } } + if (!pdev->failover_pair_id) { + ret = vfio_migration_probe(&vdev->vbasedev, errp); + if (ret) { + error_report("%s: Failed to setup for migration", + vdev->vbasedev.name); + } + } + vfio_register_err_notifier(vdev); vfio_register_req_notifier(vdev); vfio_setup_resetfn_quirk(vdev); @@ -3209,11 +3206,6 @@ out_teardown: vfio_bars_exit(vdev); error: error_prepend(errp, VFIO_MSG_PREFIX, vdev->vbasedev.name); - if (vdev->migration_blocker) { - migrate_del_blocker(vdev->migration_blocker); - error_free(vdev->migration_blocker); - vdev->migration_blocker = NULL; - } } static void vfio_instance_finalize(Object *obj) @@ -3225,10 +3217,7 @@ static void vfio_instance_finalize(Object *obj) vfio_bars_finalize(vdev); g_free(vdev->emulated_config_bits); g_free(vdev->rom); - if (vdev->migration_blocker) { - migrate_del_blocker(vdev->migration_blocker); - error_free(vdev->migration_blocker); - } + /* * XXX Leaking igd_opregion is not an oversight, we can't remove the * fw_cfg entry therefore leaking this allocation seems like the safest @@ -3256,6 +3245,7 @@ static void vfio_exitfn(PCIDevice *pdev) } vfio_teardown_msi(vdev); vfio_bars_exit(vdev); + vfio_migration_finalize(&vdev->vbasedev); } static void vfio_pci_reset(DeviceState *dev) diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h index 0da7a20a7ec2..b148c937ef72 100644 --- a/hw/vfio/pci.h +++ b/hw/vfio/pci.h @@ -168,7 +168,6 @@ typedef struct VFIOPCIDevice { bool no_vfio_ioeventfd; bool enable_ramfb; VFIODisplay *dpy; - Error *migration_blocker; Notifier irqchip_change_notifier; } VFIOPCIDevice;