vfio: Make vfio-pci device migration capable
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 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> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
9e7b0442f2
commit
a22651053b
@ -2791,17 +2791,6 @@ 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, errp);
|
||||
if (ret) {
|
||||
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;
|
||||
@ -3069,6 +3058,13 @@ 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: Migration disabled", vdev->vbasedev.name);
|
||||
}
|
||||
}
|
||||
|
||||
vfio_register_err_notifier(vdev);
|
||||
vfio_register_req_notifier(vdev);
|
||||
vfio_setup_resetfn_quirk(vdev);
|
||||
@ -3083,11 +3079,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)
|
||||
@ -3099,10 +3090,6 @@ 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
|
||||
@ -3130,6 +3117,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)
|
||||
|
@ -172,7 +172,6 @@ struct VFIOPCIDevice {
|
||||
bool no_vfio_ioeventfd;
|
||||
bool enable_ramfb;
|
||||
VFIODisplay *dpy;
|
||||
Error *migration_blocker;
|
||||
Notifier irqchip_change_notifier;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user