Message ID | 1592684486-18511-17-git-send-email-kwankhede@nvidia.com |
---|---|
State | New |
Headers | show |
Series | Add migration support for VFIO devices | expand |
On Sun, 21 Jun 2020 01:51:25 +0530 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. "If the device is not a failover primary device, call vfio_migration_probe() and vfio_migration_finalize() to enable migration support for those devices that support it respectively to tear it down again." ? > 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> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.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 5ba340aee1d4..9dc2868993fb 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2841,22 +2841,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)); > @@ -3120,6 +3109,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", "%s: migration not enabled" ? (Although I wonder how often we need to moan here, given that the called function already prints error reports.) > + vdev->vbasedev.name); > + } > + } > + > vfio_register_err_notifier(vdev); > vfio_register_req_notifier(vdev); > vfio_setup_resetfn_quirk(vdev); LGTM.
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 5ba340aee1d4..9dc2868993fb 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -2841,22 +2841,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)); @@ -3120,6 +3109,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); @@ -3134,11 +3131,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) @@ -3150,10 +3142,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 @@ -3181,6 +3170,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;