Lines Matching full:migration

2  * Migration support for VFIO devices
20 #include "hw/vfio/vfio-migration.h"
21 #include "migration/misc.h"
22 #include "migration/savevm.h"
23 #include "migration/vmstate.h"
24 #include "migration/qemu-file.h"
25 #include "migration/register.h"
26 #include "migration/blocker.h"
27 #include "migration-multifd.h"
34 #include "vfio-migration-internal.h"
37 * This is an arbitrary size based on migration of mlx5 devices, where typically
38 * total device migration size is on the order of 100s of MB. Testing with
94 VFIOMigration *migration = vbasedev->migration; in vfio_migration_send_event() local
109 dev->id, qom_path, mig_state_to_qapi_state(migration->device_state)); in vfio_migration_send_event()
115 VFIOMigration *migration = vbasedev->migration; in vfio_migration_set_device_state() local
120 migration->device_state = state; in vfio_migration_set_device_state()
129 VFIOMigration *migration = vbasedev->migration; in vfio_migration_set_state() local
144 if (new_state == migration->device_state) { in vfio_migration_set_state()
189 if (migration->data_fd != -1) { in vfio_migration_set_state()
200 migration->data_fd = mig_state->data_fd; in vfio_migration_set_state()
233 VFIOMigration *migration = vbasedev->migration; in vfio_load_buffer() local
236 ret = qemu_file_get_to_fd(f, migration->data_fd, data_size); in vfio_load_buffer()
298 VFIOMigration *migration = vbasedev->migration; in vfio_migration_cleanup() local
300 close(migration->data_fd); in vfio_migration_cleanup()
301 migration->data_fd = -1; in vfio_migration_cleanup()
327 static int vfio_query_precopy_size(VFIOMigration *migration) in vfio_query_precopy_size() argument
333 migration->precopy_init_size = 0; in vfio_query_precopy_size()
334 migration->precopy_dirty_size = 0; in vfio_query_precopy_size()
336 if (ioctl(migration->data_fd, VFIO_MIG_GET_PRECOPY_INFO, &precopy)) { in vfio_query_precopy_size()
340 migration->precopy_init_size = precopy.initial_bytes; in vfio_query_precopy_size()
341 migration->precopy_dirty_size = precopy.dirty_bytes; in vfio_query_precopy_size()
347 static ssize_t vfio_save_block(QEMUFile *f, VFIOMigration *migration) in vfio_save_block() argument
351 data_size = read(migration->data_fd, migration->data_buffer, in vfio_save_block()
352 migration->data_buffer_size); in vfio_save_block()
359 if (!migration->event_precopy_empty_hit) { in vfio_save_block()
360 trace_vfio_save_block_precopy_empty_hit(migration->vbasedev->name); in vfio_save_block()
361 migration->event_precopy_empty_hit = true; in vfio_save_block()
373 migration->event_precopy_empty_hit = false; in vfio_save_block()
377 qemu_put_buffer(f, migration->data_buffer, data_size); in vfio_save_block()
380 trace_vfio_save_block(migration->vbasedev->name, data_size); in vfio_save_block()
385 static void vfio_update_estimated_pending_data(VFIOMigration *migration, in vfio_update_estimated_pending_data() argument
393 migration->precopy_init_size = 0; in vfio_update_estimated_pending_data()
394 migration->precopy_dirty_size = 0; in vfio_update_estimated_pending_data()
399 if (migration->precopy_init_size) { in vfio_update_estimated_pending_data()
400 uint64_t init_size = MIN(migration->precopy_init_size, data_size); in vfio_update_estimated_pending_data()
402 migration->precopy_init_size -= init_size; in vfio_update_estimated_pending_data()
406 migration->precopy_dirty_size -= MIN(migration->precopy_dirty_size, in vfio_update_estimated_pending_data()
412 VFIOMigration *migration = vbasedev->migration; in vfio_precopy_supported() local
414 return migration->mig_flags & VFIO_MIGRATION_PRE_COPY; in vfio_precopy_supported()
433 errp, "%s: VFIO migration is not supported with postcopy migration", in vfio_save_prepare()
441 "%s: VFIO migration is not supported with background snapshot", in vfio_save_prepare()
452 VFIOMigration *migration = vbasedev->migration; in vfio_save_setup() local
463 migration->data_buffer_size = MIN(VFIO_MIG_DEFAULT_DATA_BUFFER_SIZE, in vfio_save_setup()
465 migration->data_buffer = g_try_malloc0(migration->data_buffer_size); in vfio_save_setup()
466 if (!migration->data_buffer) { in vfio_save_setup()
467 error_setg(errp, "%s: Failed to allocate migration data buffer", in vfio_save_setup()
472 migration->event_save_iterate_started = false; in vfio_save_setup()
473 migration->event_precopy_empty_hit = false; in vfio_save_setup()
476 switch (migration->device_state) { in vfio_save_setup()
484 vfio_query_precopy_size(migration); in vfio_save_setup()
492 migration->device_state); in vfio_save_setup()
497 trace_vfio_save_setup(vbasedev->name, migration->data_buffer_size); in vfio_save_setup()
512 VFIOMigration *migration = vbasedev->migration; in vfio_save_cleanup() local
521 * after migration has completed, so it won't increase downtime. in vfio_save_cleanup()
523 if (migration->device_state == VFIO_DEVICE_STATE_STOP_COPY) { in vfio_save_cleanup()
532 g_free(migration->data_buffer); in vfio_save_cleanup()
533 migration->data_buffer = NULL; in vfio_save_cleanup()
534 migration->precopy_init_size = 0; in vfio_save_cleanup()
535 migration->precopy_dirty_size = 0; in vfio_save_cleanup()
536 migration->initial_data_sent = false; in vfio_save_cleanup()
545 VFIOMigration *migration = vbasedev->migration; in vfio_state_pending_estimate() local
552 migration->precopy_init_size + migration->precopy_dirty_size; in vfio_state_pending_estimate()
556 migration->precopy_init_size, in vfio_state_pending_estimate()
557 migration->precopy_dirty_size); in vfio_state_pending_estimate()
561 * Migration size of VFIO devices can be as little as a few KBs or as big as
570 VFIOMigration *migration = vbasedev->migration; in vfio_state_pending_exact() local
574 * If getting pending migration size fails, VFIO_MIG_STOP_COPY_SIZE is in vfio_state_pending_exact()
581 vfio_query_precopy_size(migration); in vfio_state_pending_exact()
585 stop_copy_size, migration->precopy_init_size, in vfio_state_pending_exact()
586 migration->precopy_dirty_size); in vfio_state_pending_exact()
597 * Note about migration rate limiting: VFIO migration buffer size is currently
598 * limited to 1MB, so there is no need to check if migration rate exceeded (as
600 * later changed to a bigger value, migration rate should be enforced here.
605 VFIOMigration *migration = vbasedev->migration; in vfio_save_iterate() local
608 if (!migration->event_save_iterate_started) { in vfio_save_iterate()
610 migration->event_save_iterate_started = true; in vfio_save_iterate()
613 data_size = vfio_save_block(f, migration); in vfio_save_iterate()
618 vfio_update_estimated_pending_data(migration, data_size); in vfio_save_iterate()
620 if (migrate_switchover_ack() && !migration->precopy_init_size && in vfio_save_iterate()
621 !migration->initial_data_sent) { in vfio_save_iterate()
623 migration->initial_data_sent = true; in vfio_save_iterate()
628 trace_vfio_save_iterate(vbasedev->name, migration->precopy_init_size, in vfio_save_iterate()
629 migration->precopy_dirty_size); in vfio_save_iterate()
631 return !migration->precopy_init_size && !migration->precopy_dirty_size; in vfio_save_iterate()
657 data_size = vfio_save_block(f, vbasedev->migration); in vfio_save_complete_precopy()
694 VFIOMigration *migration = vbasedev->migration; in vfio_load_setup() local
702 migration->device_state, errp); in vfio_load_setup()
737 error_report("%s: got DEV_CONFIG_STATE in main migration " in vfio_load_state()
847 VFIOMigration *migration = vbasedev->migration; in vfio_vmstate_change_prepare() local
852 new_state = migration->device_state == VFIO_DEVICE_STATE_PRE_COPY ? in vfio_vmstate_change_prepare()
859 * Migration should be aborted in this case, but vm_state_notify() in vfio_vmstate_change_prepare()
890 * Migration should be aborted in this case, but vm_state_notify() in vfio_vmstate_change()
903 VFIOMigration *migration = container_of(notifier, VFIOMigration, in vfio_migration_state_notifier() local
905 VFIODevice *vbasedev = migration->vbasedev; in vfio_migration_state_notifier()
929 g_free(vbasedev->migration); in vfio_migration_free()
930 vbasedev->migration = NULL; in vfio_migration_free()
970 VFIOMigration *migration; in vfio_migration_init() local
990 /* Basic migration functionality must be supported */ in vfio_migration_init()
995 vbasedev->migration = g_new0(VFIOMigration, 1); in vfio_migration_init()
996 migration = vbasedev->migration; in vfio_migration_init()
997 migration->vbasedev = vbasedev; in vfio_migration_init()
998 migration->device_state = VFIO_DEVICE_STATE_RUNNING; in vfio_migration_init()
999 migration->data_fd = -1; in vfio_migration_init()
1000 migration->mig_flags = mig_flags; in vfio_migration_init()
1015 prepare_cb = migration->mig_flags & VFIO_MIGRATION_P2P ? in vfio_migration_init()
1018 migration->vm_state = qdev_add_vm_change_state_handler_full( in vfio_migration_init()
1020 migration_add_notifier(&migration->migration_state, in vfio_migration_init()
1029 * Multiple devices migration is allowed only if all devices support P2P
1030 * migration. Single device migration is allowed regardless of P2P migration
1040 if (vbasedev->migration) { in vfio_multiple_devices_migration_is_supported()
1043 if (!(vbasedev->migration->mig_flags & VFIO_MIGRATION_P2P)) { in vfio_multiple_devices_migration_is_supported()
1059 error_setg(errp, "Multiple VFIO devices migration is supported only if " in vfio_block_multiple_devices_migration()
1060 "all of them support P2P migration"); in vfio_block_multiple_devices_migration()
1069 "Multiple VFIO devices migration is supported only if all of " in vfio_block_multiple_devices_migration()
1070 "them support P2P migration"); in vfio_block_multiple_devices_migration()
1087 VFIOMigration *migration = vbasedev->migration; in vfio_migration_deinit() local
1089 migration_remove_notifier(&migration->migration_state); in vfio_migration_deinit()
1090 qemu_del_vm_change_state_handler(migration->vm_state); in vfio_migration_deinit()
1148 * Return true when either migration initialized or blocker registered.
1158 error_setg(&err, "%s: Migration is disabled for VFIO device", in vfio_migration_realize()
1166 error_setg(&err, "%s: VFIO migration is not supported in kernel", in vfio_migration_realize()
1170 "%s: Migration couldn't be initialized for VFIO device, " in vfio_migration_realize()
1198 error_setg(&err, "%s: Migration is currently not supported " in vfio_migration_realize()
1217 if (vbasedev->migration) { in vfio_migration_exit()
1226 VFIOMigration *migration = vbasedev->migration; in vfio_device_state_is_running() local
1228 return migration->device_state == VFIO_DEVICE_STATE_RUNNING || in vfio_device_state_is_running()
1229 migration->device_state == VFIO_DEVICE_STATE_RUNNING_P2P; in vfio_device_state_is_running()
1234 VFIOMigration *migration = vbasedev->migration; in vfio_device_state_is_precopy() local
1236 return migration->device_state == VFIO_DEVICE_STATE_PRE_COPY || in vfio_device_state_is_precopy()
1237 migration->device_state == VFIO_DEVICE_STATE_PRE_COPY_P2P; in vfio_device_state_is_precopy()