Lines Matching +full:- +full:- +full:disable +full:- +full:replication

10  * the COPYING file in the top-level directory.
12 * Contributions after 2012-01-13 are licensed under the terms of the
19 #include "qemu/error-report.h"
20 #include "qemu/main-loop.h"
28 #include "system/cpu-throttle.h"
35 #include "migration-stats.h"
37 #include "qemu-file.h"
42 #include "qapi/clone-visitor.h"
43 #include "qapi/qapi-visit-migration.h"
44 #include "qapi/qapi-visit-sockets.h"
45 #include "qapi/qapi-commands-migration.h"
46 #include "qapi/qapi-events-migration.h"
50 #include "postcopy-ram.h"
54 #include "io/channel-buffer.h"
55 #include "io/channel-tls.h"
118 trace_vmstate_downtime_checkpoint("src-downtime-start"); in migration_downtime_start()
119 s->downtime_start = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); in migration_downtime_start()
129 * an use-after-free itself..
151 if (!s->downtime) { in migration_downtime_end()
152 s->downtime = now - s->downtime_start; in migration_downtime_end()
153 trace_vmstate_downtime_checkpoint("src-downtime-end"); in migration_downtime_end()
190 if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) { in transport_supports_multi_channels()
191 SocketAddress *saddr = &addr->u.socket; in transport_supports_multi_channels()
193 return (saddr->type == SOCKET_ADDRESS_TYPE_INET || in transport_supports_multi_channels()
194 saddr->type == SOCKET_ADDRESS_TYPE_UNIX || in transport_supports_multi_channels()
195 saddr->type == SOCKET_ADDRESS_TYPE_VSOCK); in transport_supports_multi_channels()
196 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in transport_supports_multi_channels()
211 * When doing direct-io, multifd requires two different, in migration_needs_extra_fds()
212 * non-duplicated file descriptors so we can use one of them for in migration_needs_extra_fds()
220 if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in transport_supports_seeking()
230 return addr->transport == MIGRATION_ADDRESS_TYPE_FILE; in transport_supports_extra_fds()
245 error_setg(errp, "Migration requires multi-channel URIs (e.g. tcp)"); in migration_channels_and_transport_compatible()
257 addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in migration_channels_and_transport_compatible()
269 if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) { in migration_capabilities_and_transport_compatible()
270 return migrate_rdma_caps_check(migrate_get_current()->capabilities, in migration_capabilities_and_transport_compatible()
287 return (a > b) - (a < b); in page_request_addr_cmp()
296 s->vm_old_state = runstate_get(); in migration_stop_vm()
301 trace_vmstate_downtime_checkpoint("src-vm-stopped"); in migration_stop_vm()
319 current_incoming->state = MIGRATION_STATUS_NONE; in migration_object_init()
320 current_incoming->postcopy_remote_fds = in migration_object_init()
322 qemu_mutex_init(&current_incoming->rp_mutex); in migration_object_init()
323 qemu_mutex_init(&current_incoming->postcopy_prio_thread_mutex); in migration_object_init()
324 qemu_event_init(&current_incoming->main_thread_load_event, false); in migration_object_init()
325 qemu_sem_init(&current_incoming->postcopy_pause_sem_dst, 0); in migration_object_init()
326 qemu_sem_init(&current_incoming->postcopy_pause_sem_fault, 0); in migration_object_init()
327 qemu_sem_init(&current_incoming->postcopy_pause_sem_fast_load, 0); in migration_object_init()
328 qemu_sem_init(&current_incoming->postcopy_qemufile_dst_done, 0); in migration_object_init()
330 qemu_mutex_init(&current_incoming->page_request_mutex); in migration_object_init()
331 qemu_cond_init(&current_incoming->page_request_cond); in migration_object_init()
332 current_incoming->page_requested = g_tree_new(page_request_addr_cmp); in migration_object_init()
334 current_incoming->exit_on_error = INMIGRATE_DEFAULT_EXIT_ON_ERROR; in migration_object_init()
357 qemu_bh_delete(migbh->bh); in migration_bh_dispatch_bh()
358 migbh->bh = NULL; in migration_bh_dispatch_bh()
361 migbh->cb(migbh->opaque); in migration_bh_dispatch_bh()
374 migbh->bh = bh; in migration_bh_schedule()
375 migbh->cb = cb; in migration_bh_schedule()
376 migbh->opaque = opaque; in migration_bh_schedule()
395 * Cancel the current migration - that will (eventually) in migration_shutdown()
409 * are non-critical data, and their loss never considered as in migration_shutdown()
431 if (mis->socket_address_list) { in migration_incoming_transport_cleanup()
432 qapi_free_SocketAddressList(mis->socket_address_list); in migration_incoming_transport_cleanup()
433 mis->socket_address_list = NULL; in migration_incoming_transport_cleanup()
436 if (mis->transport_cleanup) { in migration_incoming_transport_cleanup()
437 mis->transport_cleanup(mis->transport_data); in migration_incoming_transport_cleanup()
438 mis->transport_data = mis->transport_cleanup = NULL; in migration_incoming_transport_cleanup()
451 * The VFIO load_cleanup() implementation is BQL-sensitive. It requires in migration_incoming_state_destroy()
466 if (mis->to_src_file) { in migration_incoming_state_destroy()
468 migrate_send_rp_shut(mis, qemu_file_get_error(mis->from_src_file) != 0); in migration_incoming_state_destroy()
469 qemu_fclose(mis->to_src_file); in migration_incoming_state_destroy()
470 mis->to_src_file = NULL; in migration_incoming_state_destroy()
473 if (mis->from_src_file) { in migration_incoming_state_destroy()
474 migration_ioc_unregister_yank_from_file(mis->from_src_file); in migration_incoming_state_destroy()
475 qemu_fclose(mis->from_src_file); in migration_incoming_state_destroy()
476 mis->from_src_file = NULL; in migration_incoming_state_destroy()
478 if (mis->postcopy_remote_fds) { in migration_incoming_state_destroy()
479 g_array_free(mis->postcopy_remote_fds, TRUE); in migration_incoming_state_destroy()
480 mis->postcopy_remote_fds = NULL; in migration_incoming_state_destroy()
484 qemu_event_reset(&mis->main_thread_load_event); in migration_incoming_state_destroy()
486 if (mis->page_requested) { in migration_incoming_state_destroy()
487 g_tree_destroy(mis->page_requested); in migration_incoming_state_destroy()
488 mis->page_requested = NULL; in migration_incoming_state_destroy()
491 if (mis->postcopy_qemufile_dst) { in migration_incoming_state_destroy()
492 migration_ioc_unregister_yank_from_file(mis->postcopy_qemufile_dst); in migration_incoming_state_destroy()
493 qemu_fclose(mis->postcopy_qemufile_dst); in migration_incoming_state_destroy()
494 mis->postcopy_qemufile_dst = NULL; in migration_incoming_state_destroy()
519 QEMU_LOCK_GUARD(&mis->rp_mutex); in migrate_send_rp_message()
525 if (!mis->to_src_file) { in migrate_send_rp_message()
526 ret = -EIO; in migrate_send_rp_message()
530 qemu_put_be16(mis->to_src_file, (unsigned int)message_type); in migrate_send_rp_message()
531 qemu_put_be16(mis->to_src_file, len); in migrate_send_rp_message()
532 qemu_put_buffer(mis->to_src_file, data, len); in migrate_send_rp_message()
533 return qemu_fflush(mis->to_src_file); in migrate_send_rp_message()
539 * Len: Length in bytes required - must be a multiple of pagesize
559 if (rb != mis->last_rb) { in migrate_send_rp_message_req_pages()
560 mis->last_rb = rb; in migrate_send_rp_message_req_pages()
585 WITH_QEMU_LOCK_GUARD(&mis->page_request_mutex) { in migrate_send_rp_req_pages()
588 if (!g_tree_lookup(mis->page_requested, aligned)) { in migrate_send_rp_req_pages()
595 g_tree_insert(mis->page_requested, aligned, (gpointer)1); in migrate_send_rp_req_pages()
596 qatomic_inc(&mis->page_requested_count); in migrate_send_rp_req_pages()
597 trace_postcopy_page_req_add(aligned, mis->page_requested_count); in migrate_send_rp_req_pages()
630 "replication module is not built in"); in migration_incoming_enable_colo()
631 return -ENOTSUP; in migration_incoming_enable_colo()
635 error_report("ENABLE_COLO command come in migration stream, but x-colo " in migration_incoming_enable_colo()
637 return -EINVAL; in migration_incoming_enable_colo()
641 error_report("COLO: cannot disable RAM discard"); in migration_incoming_enable_colo()
642 return -EBUSY; in migration_incoming_enable_colo()
652 QAPI_LIST_PREPEND(mis->socket_address_list, in migrate_add_address()
671 InetSocketAddress *isock = &addr->u.rdma; in migrate_uri_parse()
672 strList **tail = &addr->u.exec.args; in migrate_uri_parse()
675 addr->transport = MIGRATION_ADDRESS_TYPE_EXEC; in migrate_uri_parse()
681 QAPI_LIST_APPEND(tail, g_strdup("-c")); in migrate_uri_parse()
689 addr->transport = MIGRATION_ADDRESS_TYPE_RDMA; in migrate_uri_parse()
694 addr->transport = MIGRATION_ADDRESS_TYPE_SOCKET; in migrate_uri_parse()
699 addr->u.socket.type = saddr->type; in migrate_uri_parse()
700 addr->u.socket.u = saddr->u; in migrate_uri_parse()
704 addr->transport = MIGRATION_ADDRESS_TYPE_FILE; in migrate_uri_parse()
705 addr->u.file.filename = g_strdup(uri + strlen("file:")); in migrate_uri_parse()
706 if (file_parse_offset(addr->u.file.filename, &addr->u.file.offset, in migrate_uri_parse()
715 val->channel_type = MIGRATION_CHANNEL_TYPE_MAIN; in migrate_uri_parse()
716 val->addr = g_steal_pointer(&addr); in migrate_uri_parse()
724 MigrationStatus current = mis->state; in migration_incoming_state_setup()
740 migrate_set_state(&mis->state, current, MIGRATION_STATUS_SETUP); in migration_incoming_state_setup()
762 if (channels->next) { in qemu_start_incoming_migration()
767 addr = channels->value->addr; in qemu_start_incoming_migration()
775 addr = channel->addr; in qemu_start_incoming_migration()
787 if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) { in qemu_start_incoming_migration()
788 SocketAddress *saddr = &addr->u.socket; in qemu_start_incoming_migration()
789 if (saddr->type == SOCKET_ADDRESS_TYPE_INET || in qemu_start_incoming_migration()
790 saddr->type == SOCKET_ADDRESS_TYPE_UNIX || in qemu_start_incoming_migration()
791 saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) { in qemu_start_incoming_migration()
793 } else if (saddr->type == SOCKET_ADDRESS_TYPE_FD) { in qemu_start_incoming_migration()
794 fd_start_incoming_migration(saddr->u.fd.str, errp); in qemu_start_incoming_migration()
797 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) { in qemu_start_incoming_migration()
798 rdma_start_incoming_migration(&addr->u.rdma, errp); in qemu_start_incoming_migration()
800 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_EXEC) { in qemu_start_incoming_migration()
801 exec_start_incoming_migration(addr->u.exec.args, errp); in qemu_start_incoming_migration()
802 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in qemu_start_incoming_migration()
803 file_start_incoming_migration(&addr->u.file, errp); in qemu_start_incoming_migration()
816 trace_vmstate_downtime_checkpoint("dst-precopy-bh-enter"); in process_incoming_migration_bh()
822 qemu_announce_self(&mis->announce_timer, migrate_announce_params()); in process_incoming_migration_bh()
824 trace_vmstate_downtime_checkpoint("dst-precopy-bh-announced"); in process_incoming_migration_bh()
837 * We used to have cap 'late-block-activate' but now we do this in process_incoming_migration_bh()
856 trace_vmstate_downtime_checkpoint("dst-precopy-bh-vm-started"); in process_incoming_migration_bh()
862 migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, in process_incoming_migration_bh()
876 assert(mis->from_src_file); in process_incoming_migration_co()
878 mis->largest_page_size = qemu_ram_pagesize_largest(); in process_incoming_migration_co()
880 migrate_set_state(&mis->state, MIGRATION_STATUS_SETUP, in process_incoming_migration_co()
883 mis->loadvm_co = qemu_coroutine_self(); in process_incoming_migration_co()
884 ret = qemu_loadvm_state(mis->from_src_file); in process_incoming_migration_co()
885 mis->loadvm_co = NULL; in process_incoming_migration_co()
887 trace_vmstate_downtime_checkpoint("dst-precopy-loadvm-completed"); in process_incoming_migration_co()
911 error_setg(&local_err, "load of migration failed: %s", strerror(-ret)); in process_incoming_migration_co()
924 migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, in process_incoming_migration_co()
931 if (mis->exit_on_error) { in process_incoming_migration_co()
932 WITH_QEMU_LOCK_GUARD(&s->error_mutex) { in process_incoming_migration_co()
933 error_report_err(s->error); in process_incoming_migration_co()
934 s->error = NULL; in process_incoming_migration_co()
952 assert(!mis->from_src_file); in migration_incoming_setup()
953 mis->from_src_file = f; in migration_incoming_setup()
968 if (mis->state == MIGRATION_STATUS_POSTCOPY_PAUSED) { in postcopy_try_recover()
972 assert(mis->from_src_file); in postcopy_try_recover()
974 qemu_file_set_blocking(mis->from_src_file, true); in postcopy_try_recover()
976 /* Re-configure the return path */ in postcopy_try_recover()
977 mis->to_src_file = qemu_file_get_return_path(mis->from_src_file); in postcopy_try_recover()
979 migrate_set_state(&mis->state, MIGRATION_STATUS_POSTCOPY_PAUSED, in postcopy_try_recover()
989 qemu_sem_post(&mis->postcopy_pause_sem_dst); in postcopy_try_recover()
1008 if (!mis->from_src_file) { in migration_has_main_and_multifd_channels()
1054 } else if (!mis->from_src_file && in migration_ioc_process_incoming()
1055 mis->state == MIGRATION_STATUS_POSTCOPY_PAUSED) { in migration_ioc_process_incoming()
1062 } else if (mis->from_src_file && migrate_multifd()) { in migration_ioc_process_incoming()
1064 * Non-peekable channels like tls/file are processed as in migration_ioc_process_incoming()
1068 } else if (!mis->from_src_file) { in migration_ioc_process_incoming()
1071 error_setg(errp, "non-peekable channel used without multifd"); in migration_ioc_process_incoming()
1094 assert(!mis->postcopy_qemufile_dst); in migration_ioc_process_incoming()
1122 if (migrate_postcopy_preempt() && !mis->postcopy_qemufile_dst) { in migration_has_all_channels()
1136 * to indicate that we've finished with the RP. Non-0 value indicates
1176 if (mis->state != MIGRATION_STATUS_POSTCOPY_RECOVER) { in migrate_send_rp_recv_bitmap()
1193 qemu_mutex_lock(&mis->rp_mutex); in migrate_send_rp_recv_bitmap()
1194 res = ramblock_recv_bitmap_send(mis->to_src_file, block_name); in migrate_send_rp_recv_bitmap()
1195 qemu_mutex_unlock(&mis->rp_mutex); in migrate_send_rp_recv_bitmap()
1216 switch (s->state) { in migration_is_running()
1238 return (s->state == MIGRATION_STATUS_ACTIVE || in migration_is_active()
1239 s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE); in migration_is_active()
1244 return (s->state == MIGRATION_STATUS_COMPLETED) || migration_in_postcopy(); in migrate_show_downtime()
1249 info->has_status = true; in populate_time_info()
1250 info->has_setup_time = true; in populate_time_info()
1251 info->setup_time = s->setup_time; in populate_time_info()
1253 if (s->state == MIGRATION_STATUS_COMPLETED) { in populate_time_info()
1254 info->has_total_time = true; in populate_time_info()
1255 info->total_time = s->total_time; in populate_time_info()
1257 info->has_total_time = true; in populate_time_info()
1258 info->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) - in populate_time_info()
1259 s->start_time; in populate_time_info()
1263 info->has_downtime = true; in populate_time_info()
1264 info->downtime = s->downtime; in populate_time_info()
1266 info->has_expected_downtime = true; in populate_time_info()
1267 info->expected_downtime = s->expected_downtime; in populate_time_info()
1275 info->ram = g_malloc0(sizeof(*info->ram)); in populate_ram_info()
1276 info->ram->transferred = migration_transferred_bytes(); in populate_ram_info()
1277 info->ram->total = ram_bytes_total(); in populate_ram_info()
1278 info->ram->duplicate = stat64_get(&mig_stats.zero_pages); in populate_ram_info()
1279 info->ram->normal = stat64_get(&mig_stats.normal_pages); in populate_ram_info()
1280 info->ram->normal_bytes = info->ram->normal * page_size; in populate_ram_info()
1281 info->ram->mbps = s->mbps; in populate_ram_info()
1282 info->ram->dirty_sync_count = in populate_ram_info()
1284 info->ram->dirty_sync_missed_zero_copy = in populate_ram_info()
1286 info->ram->postcopy_requests = in populate_ram_info()
1288 info->ram->page_size = page_size; in populate_ram_info()
1289 info->ram->multifd_bytes = stat64_get(&mig_stats.multifd_bytes); in populate_ram_info()
1290 info->ram->pages_per_second = s->pages_per_second; in populate_ram_info()
1291 info->ram->precopy_bytes = stat64_get(&mig_stats.precopy_bytes); in populate_ram_info()
1292 info->ram->downtime_bytes = stat64_get(&mig_stats.downtime_bytes); in populate_ram_info()
1293 info->ram->postcopy_bytes = stat64_get(&mig_stats.postcopy_bytes); in populate_ram_info()
1296 info->xbzrle_cache = g_malloc0(sizeof(*info->xbzrle_cache)); in populate_ram_info()
1297 info->xbzrle_cache->cache_size = migrate_xbzrle_cache_size(); in populate_ram_info()
1298 info->xbzrle_cache->bytes = xbzrle_counters.bytes; in populate_ram_info()
1299 info->xbzrle_cache->pages = xbzrle_counters.pages; in populate_ram_info()
1300 info->xbzrle_cache->cache_miss = xbzrle_counters.cache_miss; in populate_ram_info()
1301 info->xbzrle_cache->cache_miss_rate = xbzrle_counters.cache_miss_rate; in populate_ram_info()
1302 info->xbzrle_cache->encoding_rate = xbzrle_counters.encoding_rate; in populate_ram_info()
1303 info->xbzrle_cache->overflow = xbzrle_counters.overflow; in populate_ram_info()
1307 info->has_cpu_throttle_percentage = true; in populate_ram_info()
1308 info->cpu_throttle_percentage = cpu_throttle_get_percentage(); in populate_ram_info()
1311 if (s->state != MIGRATION_STATUS_COMPLETED) { in populate_ram_info()
1312 info->ram->remaining = ram_bytes_remaining(); in populate_ram_info()
1313 info->ram->dirty_pages_rate = in populate_ram_info()
1318 info->has_dirty_limit_throttle_time_per_round = true; in populate_ram_info()
1319 info->dirty_limit_throttle_time_per_round = in populate_ram_info()
1322 info->has_dirty_limit_ring_full_time = true; in populate_ram_info()
1323 info->dirty_limit_ring_full_time = dirtylimit_ring_full_time(); in populate_ram_info()
1330 int state = qatomic_read(&s->state); in fill_source_migration_info()
1333 info->blocked_reasons = NULL; in fill_source_migration_info()
1337 * a) devices marked in VMState as non-migratable, and in fill_source_migration_info()
1341 qemu_savevm_non_migratable_list(&info->blocked_reasons); in fill_source_migration_info()
1344 QAPI_LIST_PREPEND(info->blocked_reasons, in fill_source_migration_info()
1345 g_strdup(error_get_pretty(cur_blocker->data))); in fill_source_migration_info()
1348 info->has_blocked_reasons = info->blocked_reasons != NULL; in fill_source_migration_info()
1356 info->has_status = true; in fill_source_migration_info()
1357 info->has_total_time = false; in fill_source_migration_info()
1373 info->has_status = true; in fill_source_migration_info()
1382 info->has_status = true; in fill_source_migration_info()
1385 info->has_status = true; in fill_source_migration_info()
1388 info->has_status = true; in fill_source_migration_info()
1391 info->status = state; in fill_source_migration_info()
1393 QEMU_LOCK_GUARD(&s->error_mutex); in fill_source_migration_info()
1394 if (s->error) { in fill_source_migration_info()
1395 info->error_desc = g_strdup(error_get_pretty(s->error)); in fill_source_migration_info()
1403 if (mis->socket_address_list) { in fill_destination_migration_info()
1404 info->has_socket_address = true; in fill_destination_migration_info()
1405 info->socket_address = in fill_destination_migration_info()
1406 QAPI_CLONE(SocketAddressList, mis->socket_address_list); in fill_destination_migration_info()
1409 switch (mis->state) { in fill_destination_migration_info()
1419 info->has_status = true; in fill_destination_migration_info()
1422 info->has_status = true; in fill_destination_migration_info()
1428 info->status = mis->state; in fill_destination_migration_info()
1430 if (!info->error_desc) { in fill_destination_migration_info()
1432 QEMU_LOCK_GUARD(&s->error_mutex); in fill_destination_migration_info()
1434 if (s->error) { in fill_destination_migration_info()
1435 info->error_desc = g_strdup(error_get_pretty(s->error)); in fill_destination_migration_info()
1460 if (s->state == MIGRATION_STATUS_NONE) { in qmp_migrate_start_postcopy()
1469 qatomic_set(&s->start_postcopy, true); in qmp_migrate_start_postcopy()
1486 g_clear_pointer(&s->vmdesc, json_writer_free); in migration_cleanup_json_writer()
1498 g_free(s->hostname); in migration_cleanup()
1499 s->hostname = NULL; in migration_cleanup()
1507 if (s->migration_thread_running) { in migration_cleanup()
1509 qemu_thread_join(&s->thread); in migration_cleanup()
1510 s->migration_thread_running = false; in migration_cleanup()
1514 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_cleanup()
1519 tmp = s->to_dst_file; in migration_cleanup()
1520 s->to_dst_file = NULL; in migration_cleanup()
1536 if (s->state == MIGRATION_STATUS_CANCELLING) { in migration_cleanup()
1537 migrate_set_state(&s->state, MIGRATION_STATUS_CANCELLING, in migration_cleanup()
1541 if (s->error) { in migration_cleanup()
1543 error_report_err(error_copy(s->error)); in migration_cleanup()
1558 QEMU_LOCK_GUARD(&s->error_mutex); in migrate_set_error()
1562 if (!s->error) { in migrate_set_error()
1563 s->error = error_copy(error); in migrate_set_error()
1570 QEMU_LOCK_GUARD(&s->error_mutex); in migrate_has_error()
1571 return qatomic_read(&s->error); in migrate_has_error()
1576 QEMU_LOCK_GUARD(&s->error_mutex); in migrate_error_free()
1577 if (s->error) { in migrate_error_free()
1578 error_free(s->error); in migrate_error_free()
1579 s->error = NULL; in migrate_error_free()
1585 MigrationStatus current = s->state; in migration_connect_set_error()
1588 assert(s->to_dst_file == NULL); in migration_connect_set_error()
1608 migrate_set_state(&s->state, current, next); in migration_connect_set_error()
1616 bool setup = (s->state == MIGRATION_STATUS_SETUP); in migration_cancel()
1621 qmp_cancel_vcpu_dirty_limit(false, -1, NULL); in migration_cancel()
1624 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_cancel()
1625 if (s->rp_state.from_dst_file) { in migration_cancel()
1627 qemu_file_shutdown(s->rp_state.from_dst_file); in migration_cancel()
1632 old_state = s->state; in migration_cancel()
1638 qemu_event_set(&s->pause_event); in migration_cancel()
1640 migrate_set_state(&s->state, old_state, MIGRATION_STATUS_CANCELLING); in migration_cancel()
1641 } while (s->state != MIGRATION_STATUS_CANCELLING); in migration_cancel()
1648 if (s->state == MIGRATION_STATUS_CANCELLING) { in migration_cancel()
1649 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_cancel()
1650 if (s->to_dst_file) { in migration_cancel()
1651 qemu_file_shutdown(s->to_dst_file); in migration_cancel()
1660 if (setup && !s->to_dst_file) { in migration_cancel()
1661 migrate_set_state(&s->state, MIGRATION_STATUS_CANCELLING, in migration_cancel()
1671 notify->notify = (NotifierWithReturnFunc)func; in migration_add_notifier_mode()
1683 if (notify->notify) { in migration_remove_notifier()
1685 notify->notify = NULL; in migration_remove_notifier()
1692 MigMode mode = s->parameters.mode; in migration_call_notifiers()
1705 return (s->state == MIGRATION_STATUS_CANCELLED || in migration_has_failed()
1706 s->state == MIGRATION_STATUS_FAILED); in migration_has_failed()
1713 switch (s->state) { in migration_in_postcopy()
1758 return qemu_thread_is_self(&s->thread); in migration_thread_is_self()
1763 MigMode mode = s->parameters.mode; in migrate_mode_is_cpr()
1782 s->to_dst_file = NULL; in migrate_init()
1783 s->state = MIGRATION_STATUS_NONE; in migrate_init()
1784 s->rp_state.from_dst_file = NULL; in migrate_init()
1785 s->mbps = 0.0; in migrate_init()
1786 s->pages_per_second = 0.0; in migrate_init()
1787 s->downtime = 0; in migrate_init()
1788 s->expected_downtime = 0; in migrate_init()
1789 s->setup_time = 0; in migrate_init()
1790 s->start_postcopy = false; in migrate_init()
1791 s->migration_thread_running = false; in migrate_init()
1792 error_free(s->error); in migrate_init()
1793 s->error = NULL; in migrate_init()
1796 s->vmdesc = json_writer_new(false); in migrate_init()
1799 migrate_set_state(&s->state, MIGRATION_STATUS_NONE, MIGRATION_STATUS_SETUP); in migrate_init()
1801 s->start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); in migrate_init()
1802 s->total_time = 0; in migrate_init()
1803 s->vm_old_state = -1; in migrate_init()
1804 s->iteration_initial_bytes = 0; in migrate_init()
1805 s->threshold_size = 0; in migrate_init()
1806 s->switchover_acked = false; in migrate_init()
1807 s->rdma_migration = false; in migrate_init()
1839 "(--only-migratable) for: "); in is_only_migratable()
1850 while (mode != -1 && mode != MIG_MODE_ALL) { in get_modes()
1856 modes = BIT(MIG_MODE__MAX) - 1; in get_modes()
1879 return migrate_add_blocker_modes(reasonp, errp, MIG_MODE_NORMAL, -1); in migrate_add_blocker_normal()
1892 return -EACCES; in migrate_add_blocker_modes()
1894 return -EBUSY; in migrate_add_blocker_modes()
1901 int modes = BIT(MIG_MODE__MAX) - 1; in migrate_add_blocker_internal()
1904 return -EBUSY; in migrate_add_blocker_internal()
1935 error_setg(errp, "'-incoming' was not specified on the command line"); in qmp_migrate_incoming()
1943 mis->exit_on_error = in qmp_migrate_incoming()
1979 if (mis->state != MIGRATION_STATUS_POSTCOPY_PAUSED) { in qmp_migrate_recover()
1990 * only re-setup the migration stream and poke existing migration in qmp_migrate_recover()
2002 if (migration_postcopy_is_alive(ms->state)) { in qmp_migrate_pause()
2011 qemu_mutex_lock(&ms->qemu_file_lock); in qmp_migrate_pause()
2012 if (ms->to_dst_file) { in qmp_migrate_pause()
2013 ret = qemu_file_shutdown(ms->to_dst_file); in qmp_migrate_pause()
2015 qemu_mutex_unlock(&ms->qemu_file_lock); in qmp_migrate_pause()
2029 if (migration_postcopy_is_alive(mis->state)) { in qmp_migrate_pause()
2030 ret = qemu_file_shutdown(mis->from_src_file); in qmp_migrate_pause()
2037 error_setg(errp, "migrate-pause is currently only supported " in qmp_migrate_pause()
2038 "during postcopy-active or postcopy-recover state"); in qmp_migrate_pause()
2050 error_propagate(errp, error_copy(blockers->data)); in migration_is_blocked()
2061 if (s->state != MIGRATION_STATUS_POSTCOPY_PAUSED) { in migrate_prepare()
2068 * Postcopy recovery won't work well with release-ram in migrate_prepare()
2069 * capability since release-ram will drop the page buffer as in migrate_prepare()
2075 * Luckily release-ram was designed to only be used when src in migrate_prepare()
2081 "when release-ram capability is set"); in migrate_prepare()
2085 migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_PAUSED, in migrate_prepare()
2120 error_setg(errp, "Cannot use TLS with mapped-ram"); in migrate_prepare()
2125 error_setg(errp, "Cannot use compression with mapped-ram"); in migrate_prepare()
2160 s->hup_source = qio_channel_create_watch(ioc, G_IO_HUP); in migrate_hup_add()
2161 g_source_set_callback(s->hup_source, cb, opaque, NULL); in migrate_hup_add()
2162 g_source_attach(s->hup_source, NULL); in migrate_hup_add()
2167 if (s->hup_source) { in migrate_hup_delete()
2168 g_source_destroy(s->hup_source); in migrate_hup_delete()
2169 g_source_unref(s->hup_source); in migrate_hup_delete()
2170 s->hup_source = NULL; in migrate_hup_delete()
2209 for ( ; channels; channels = channels->next) { in qmp_migrate()
2210 MigrationChannelType type = channels->value->channel_type; in qmp_migrate()
2217 channelv[type] = channels->value; in qmp_migrate()
2220 addr = channelv[MIGRATION_CHANNEL_TYPE_MAIN]->addr; in qmp_migrate()
2232 addr = channel->addr; in qmp_migrate()
2240 if (s->parameters.mode == MIG_MODE_CPR_TRANSFER && !cpr_channel) { in qmp_migrate()
2256 * For cpr-transfer, the target may not be listening yet on the migration in qmp_migrate()
2258 * us it is listening by closing the cpr-state socket. Wait for that HUP in qmp_migrate()
2265 if (s->parameters.mode == MIG_MODE_CPR_TRANSFER) { in qmp_migrate()
2292 if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) { in qmp_migrate_finish()
2293 SocketAddress *saddr = &addr->u.socket; in qmp_migrate_finish()
2294 if (saddr->type == SOCKET_ADDRESS_TYPE_INET || in qmp_migrate_finish()
2295 saddr->type == SOCKET_ADDRESS_TYPE_UNIX || in qmp_migrate_finish()
2296 saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) { in qmp_migrate_finish()
2298 } else if (saddr->type == SOCKET_ADDRESS_TYPE_FD) { in qmp_migrate_finish()
2299 fd_start_outgoing_migration(s, saddr->u.fd.str, &local_err); in qmp_migrate_finish()
2302 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) { in qmp_migrate_finish()
2303 rdma_start_outgoing_migration(s, &addr->u.rdma, &local_err); in qmp_migrate_finish()
2305 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_EXEC) { in qmp_migrate_finish()
2306 exec_start_outgoing_migration(s, addr->u.exec.args, &local_err); in qmp_migrate_finish()
2307 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in qmp_migrate_finish()
2308 file_start_outgoing_migration(s, &addr->u.file, &local_err); in qmp_migrate_finish()
2312 migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, in qmp_migrate_finish()
2345 if (s->state != state) { in qmp_migrate_continue()
2347 MigrationStatus_str(s->state)); in qmp_migrate_continue()
2350 qemu_event_set(&s->pause_event); in qmp_migrate_continue()
2357 return -1; in migration_rp_wait()
2360 qemu_sem_wait(&s->rp_state.rp_sem); in migration_rp_wait()
2364 return -1; in migration_rp_wait()
2372 qemu_sem_post(&s->rp_state.rp_sem); in migration_rp_kick()
2376 ssize_t len; /* -1 = variable */
2379 [MIG_RP_MSG_INVALID] = { .len = -1, .name = "INVALID" },
2383 [MIG_RP_MSG_REQ_PAGES_ID] = { .len = -1, .name = "REQ_PAGES_ID" },
2384 [MIG_RP_MSG_RECV_BITMAP] = { .len = -1, .name = "RECV_BITMAP" },
2387 [MIG_RP_MSG_MAX] = { .len = -1, .name = "MAX" },
2443 migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_RECOVER, in migrate_handle_rp_resume_ack()
2453 * Release ms->rp_state.from_dst_file (and postcopy_qemufile_src if
2460 WITH_QEMU_LOCK_GUARD(&ms->qemu_file_lock) { in migration_release_dst_files()
2465 file = ms->rp_state.from_dst_file; in migration_release_dst_files()
2466 ms->rp_state.from_dst_file = NULL; in migration_release_dst_files()
2474 if (ms->postcopy_qemufile_src) { in migration_release_dst_files()
2475 migration_ioc_unregister_yank_from_file(ms->postcopy_qemufile_src); in migration_release_dst_files()
2476 qemu_file_shutdown(ms->postcopy_qemufile_src); in migration_release_dst_files()
2477 qemu_fclose(ms->postcopy_qemufile_src); in migration_release_dst_files()
2478 ms->postcopy_qemufile_src = NULL; in migration_release_dst_files()
2491 QEMUFile *rp = ms->rp_state.from_dst_file; in source_return_path_thread()
2521 if ((rp_cmd_args[header_type].len != -1 && in source_return_path_thread()
2558 qemu_sem_post(&ms->rp_state.rp_pong_acks); in source_return_path_thread()
2613 ms->switchover_acked = true; in source_return_path_thread()
2629 if (ms->state == MIGRATION_STATUS_POSTCOPY_RECOVER) { in source_return_path_thread()
2651 ms->rp_state.from_dst_file = qemu_file_get_return_path(ms->to_dst_file); in open_return_path_on_source()
2652 if (!ms->rp_state.from_dst_file) { in open_return_path_on_source()
2653 return -1; in open_return_path_on_source()
2658 qemu_thread_create(&ms->rp_state.rp_thread, MIGRATION_THREAD_SRC_RETURN, in open_return_path_on_source()
2660 ms->rp_state.rp_thread_created = true; in open_return_path_on_source()
2670 if (!ms->rp_state.rp_thread_created) { in close_return_path_on_source()
2682 WITH_QEMU_LOCK_GUARD(&ms->qemu_file_lock) { in close_return_path_on_source()
2683 if (migrate_has_error(ms) && ms->rp_state.from_dst_file) { in close_return_path_on_source()
2684 qemu_file_shutdown(ms->rp_state.from_dst_file); in close_return_path_on_source()
2688 qemu_thread_join(&ms->rp_state.rp_thread); in close_return_path_on_source()
2689 ms->rp_state.rp_thread_created = false; in close_return_path_on_source()
2701 qemu_sem_wait(&ms->rp_state.rp_pong_acks); in migration_wait_main_channel()
2706 * Returns non-0 on error
2725 if (ms->state != MIGRATION_STATUS_CANCELLING) { in postcopy_start()
2726 migrate_set_state(&ms->state, ms->state, in postcopy_start()
2731 return -1; in postcopy_start()
2735 if (!qemu_savevm_state_postcopy_prepare(ms->to_dst_file, errp)) { in postcopy_start()
2736 return -1; in postcopy_start()
2745 error_setg_errno(errp, -ret, "%s: Failed to stop the VM", __func__); in postcopy_start()
2754 * Cause any non-postcopiable, but iterative devices to in postcopy_start()
2757 ret = qemu_savevm_state_complete_precopy_iterable(ms->to_dst_file, true); in postcopy_start()
2759 error_setg(errp, "Postcopy save non-postcopiable iterables failed"); in postcopy_start()
2764 * in Finish migrate and with the io-lock held everything should in postcopy_start()
2775 qemu_savevm_send_ping(ms->to_dst_file, 2); in postcopy_start()
2782 * it starts processing it. Unfortunately the ad-hoc migration format in postcopy_start()
2784 * parsing it through each devices load-state code (especially the open in postcopy_start()
2790 qio_channel_set_name(QIO_CHANNEL(bioc), "migration-postcopy-buffer"); in postcopy_start()
2802 error_setg(errp, "Postcopy save non-iterable device states failed"); in postcopy_start()
2818 ret = qemu_file_get_error(ms->to_dst_file); in postcopy_start()
2825 if (qemu_savevm_send_packaged(ms->to_dst_file, bioc->data, bioc->usage)) { in postcopy_start()
2844 qemu_savevm_send_ping(ms->to_dst_file, 4); in postcopy_start()
2851 ret = qemu_file_get_error(ms->to_dst_file); in postcopy_start()
2853 error_setg_errno(errp, -ret, "postcopy_start: Migration stream error"); in postcopy_start()
2864 /* Now, switchover looks all fine, switching to postcopy-active */ in postcopy_start()
2865 migrate_set_state(&ms->state, MIGRATION_STATUS_DEVICE, in postcopy_start()
2875 if (ms->state != MIGRATION_STATUS_CANCELLING) { in postcopy_start()
2876 migrate_set_state(&ms->state, ms->state, MIGRATION_STATUS_FAILED); in postcopy_start()
2881 return -1; in postcopy_start()
2889 * Prepares for the switchover, depending on "pause-before-switchover"
2893 * [postcopy-]active -> pre-switchover -> device
2896 * [postcopy-]active -> device
2903 if (s->state == MIGRATION_STATUS_CANCELLING) { in migration_switchover_prepare()
2916 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_DEVICE); in migration_switchover_prepare()
2925 qemu_event_reset(&s->pause_event); in migration_switchover_prepare()
2928 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_PRE_SWITCHOVER); in migration_switchover_prepare()
2931 qemu_event_wait(&s->pause_event); in migration_switchover_prepare()
2937 * pre-switchover. in migration_switchover_prepare()
2939 migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER, in migration_switchover_prepare()
2942 return s->state == MIGRATION_STATUS_DEVICE; in migration_switchover_prepare()
2970 qemu_savevm_maybe_send_switchover_start(s->to_dst_file); in migration_switchover_start()
2989 ret = -EFAULT; in migration_completion_precopy()
2993 ret = qemu_savevm_state_complete_precopy(s->to_dst_file, false); in migration_completion_precopy()
3004 qemu_savevm_state_complete_postcopy(s->to_dst_file); in migration_completion_postcopy()
3011 if (migrate_postcopy_preempt() && s->preempt_pre_7_2) { in migration_completion_postcopy()
3029 if (s->state == MIGRATION_STATUS_ACTIVE) { in migration_completion()
3031 } else if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { in migration_completion()
3034 ret = -1; in migration_completion()
3045 if (qemu_file_get_error(s->to_dst_file)) { in migration_completion()
3050 if (migrate_colo() && s->state == MIGRATION_STATUS_ACTIVE) { in migration_completion()
3052 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in migration_completion()
3061 if (qemu_file_get_error_obj(s->to_dst_file, &local_err)) { in migration_completion()
3065 error_setg_errno(&local_err, -ret, "Error in migration completion"); in migration_completion()
3070 if (s->state != MIGRATION_STATUS_CANCELLING) { in migration_completion()
3071 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); in migration_completion()
3083 int current_active_state = s->state; in bg_migration_completion()
3085 if (s->state == MIGRATION_STATUS_ACTIVE) { in bg_migration_completion()
3088 * The next step is to flush the non-RAM content (device state) in bg_migration_completion()
3092 qemu_put_buffer(s->to_dst_file, s->bioc->data, s->bioc->usage); in bg_migration_completion()
3093 qemu_fflush(s->to_dst_file); in bg_migration_completion()
3094 } else if (s->state == MIGRATION_STATUS_CANCELLING) { in bg_migration_completion()
3098 if (qemu_file_get_error(s->to_dst_file)) { in bg_migration_completion()
3107 migrate_set_state(&s->state, current_active_state, in bg_migration_completion()
3122 qemu_savevm_send_postcopy_resume(s->to_dst_file); in postcopy_resume_handshake()
3124 while (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) { in postcopy_resume_handshake()
3126 return -1; in postcopy_resume_handshake()
3130 if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { in postcopy_resume_handshake()
3134 return -1; in postcopy_resume_handshake()
3154 * If preempt is enabled, re-establish the preempt channel. Note that in postcopy_do_resume()
3169 * switch to postcopy-active afterwards) in postcopy_do_resume()
3187 assert(s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE); in postcopy_pause()
3195 * re-created when we resume. in postcopy_pause()
3208 assert(s->to_dst_file); in postcopy_pause()
3209 migration_ioc_unregister_yank_from_file(s->to_dst_file); in postcopy_pause()
3210 qemu_mutex_lock(&s->qemu_file_lock); in postcopy_pause()
3211 file = s->to_dst_file; in postcopy_pause()
3212 s->to_dst_file = NULL; in postcopy_pause()
3213 qemu_mutex_unlock(&s->qemu_file_lock); in postcopy_pause()
3218 migrate_set_state(&s->state, s->state, in postcopy_pause()
3229 qemu_sem_wait(&s->postcopy_pause_sem); in postcopy_pause()
3230 } while (postcopy_is_paused(s->state)); in postcopy_pause()
3232 if (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) { in postcopy_pause()
3259 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_file_set_error()
3260 if (s->to_dst_file) { in migration_file_set_error()
3261 qemu_file_set_error_obj(s->to_dst_file, ret, err); in migration_file_set_error()
3271 int state = s->state; in migration_detect_error()
3284 ret = qemu_file_get_error_obj_any(s->to_dst_file, in migration_detect_error()
3285 s->postcopy_qemufile_src, in migration_detect_error()
3310 migrate_set_state(&s->state, state, MIGRATION_STATUS_FAILED); in migration_detect_error()
3325 * Take the BQL here so that query-migrate on the QMP thread sees: in migration_completion_end()
3326 * - atomic update of s->total_time and s->mbps; in migration_completion_end()
3327 * - correct ordering of s->mbps update vs. s->state; in migration_completion_end()
3331 s->total_time = end_time - s->start_time; in migration_completion_end()
3332 transfer_time = s->total_time - s->setup_time; in migration_completion_end()
3334 s->mbps = ((double) bytes * 8.0) / transfer_time / 1000; in migration_completion_end()
3337 migrate_set_state(&s->state, s->state, in migration_completion_end()
3348 s->iteration_start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); in update_iteration_initial_status()
3349 s->iteration_initial_bytes = migration_transferred_bytes(); in update_iteration_initial_status()
3350 s->iteration_initial_pages = ram_get_total_transferred_pages(); in update_iteration_initial_status()
3363 if (current_time < s->iteration_start_time + BUFFER_DELAY) { in migration_update_counters()
3369 transferred = current_bytes - s->iteration_initial_bytes; in migration_update_counters()
3370 time_spent = current_time - s->iteration_start_time; in migration_update_counters()
3384 s->threshold_size = expected_bw_per_ms * migrate_downtime_limit(); in migration_update_counters()
3386 s->mbps = (((double) transferred * 8.0) / in migration_update_counters()
3389 transferred_pages = ram_get_total_transferred_pages() - in migration_update_counters()
3390 s->iteration_initial_pages; in migration_update_counters()
3391 s->pages_per_second = (double) transferred_pages / in migration_update_counters()
3400 s->expected_downtime = in migration_update_counters()
3411 s->threshold_size); in migration_update_counters()
3425 return s->switchover_acked; in migration_can_switchover()
3443 bool in_postcopy = s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE; in migration_iteration_run()
3447 /* Fast path - get the estimated amount of pending data */ in migration_iteration_run()
3466 if (pending_size < s->threshold_size) { in migration_iteration_run()
3474 if (must_precopy <= s->threshold_size && in migration_iteration_run()
3475 can_switchover && qatomic_read(&s->start_postcopy)) { in migration_iteration_run()
3490 complete_ready = can_switchover && (pending_size <= s->threshold_size); in migration_iteration_run()
3500 qemu_savevm_state_iterate(s->to_dst_file, in_postcopy); in migration_iteration_run()
3509 * If we enabled cpu throttling for auto-converge, turn it off. in migration_iteration_finish()
3517 switch (s->state) { in migration_iteration_finish()
3524 s->vm_old_state = RUN_STATE_RUNNING; in migration_iteration_finish()
3530 * Re-activate the block drives if they're inactivated. Note, COLO in migration_iteration_finish()
3531 * shouldn't use block_active at all, so it should be no-op there. in migration_iteration_finish()
3534 if (runstate_is_live(s->vm_old_state)) { in migration_iteration_finish()
3540 runstate_set(s->vm_old_state); in migration_iteration_finish()
3547 error_report("%s: Unknown ending state %d", __func__, s->state); in migration_iteration_finish()
3558 * Stop tracking RAM writes - un-protect memory, un-register UFFD in bg_migration_iteration_finish()
3565 switch (s->state) { in bg_migration_iteration_finish()
3575 error_report("%s: Unknown ending state %d", __func__, s->state); in bg_migration_iteration_finish()
3591 res = qemu_savevm_state_iterate(s->to_dst_file, false); in bg_migration_iteration_run()
3602 qemu_sem_post(&migrate_get_current()->rate_limit_sem); in migration_make_urgent_request()
3607 qemu_sem_wait(&migrate_get_current()->rate_limit_sem); in migration_consume_urgent_request()
3618 if (migration_rate_exceeded(s->to_dst_file)) { in migration_rate_limit()
3620 if (qemu_file_get_error(s->to_dst_file)) { in migration_rate_limit()
3627 int ms = s->iteration_start_time + BUFFER_DELAY - now; in migration_rate_limit()
3629 if (qemu_sem_timedwait(&s->rate_limit_sem, ms) == 0) { in migration_rate_limit()
3637 qemu_sem_post(&s->rate_limit_sem); in migration_rate_limit()
3654 migrate_set_state(&s->state, old_state, MIGRATION_STATUS_WAIT_UNPLUG); in qemu_savevm_wait_unplug()
3656 while (s->state == MIGRATION_STATUS_WAIT_UNPLUG && in qemu_savevm_wait_unplug()
3658 qemu_sem_timedwait(&s->wait_unplug_sem, 250); in qemu_savevm_wait_unplug()
3660 if (s->state != MIGRATION_STATUS_WAIT_UNPLUG) { in qemu_savevm_wait_unplug()
3667 while (timeout-- && qemu_savevm_state_guest_unplug_pending()) { in qemu_savevm_wait_unplug()
3668 qemu_sem_timedwait(&s->wait_unplug_sem, 250); in qemu_savevm_wait_unplug()
3677 migrate_set_state(&s->state, MIGRATION_STATUS_WAIT_UNPLUG, new_state); in qemu_savevm_wait_unplug()
3679 migrate_set_state(&s->state, old_state, new_state); in qemu_savevm_wait_unplug()
3709 qemu_savevm_state_header(s->to_dst_file); in migration_thread()
3716 if (s->rp_state.rp_thread_created) { in migration_thread()
3718 qemu_savevm_send_open_return_path(s->to_dst_file); in migration_thread()
3721 qemu_savevm_send_ping(s->to_dst_file, 1); in migration_thread()
3730 qemu_savevm_send_postcopy_advise(s->to_dst_file); in migration_thread()
3735 qemu_savevm_send_colo_enable(s->to_dst_file); in migration_thread()
3744 ret = qemu_savevm_state_setup(s->to_dst_file, &local_err); in migration_thread()
3751 * Handle SETUP failures after waiting for virtio-net-failover in migration_thread()
3757 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in migration_thread()
3762 s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; in migration_thread()
3767 if (urgent || !migration_rate_exceeded(s->to_dst_file)) { in migration_thread()
3809 vm_resume(s->vm_old_state); in bg_migration_vm_start_bh()
3847 * stash the non-RAM part of the vmstate to the temporary buffer, in bg_migration_thread()
3849 * with vCPUs running and, finally, write stashed non-RAM part of in bg_migration_thread()
3852 s->bioc = qio_channel_buffer_new(512 * 1024); in bg_migration_thread()
3853 qio_channel_set_name(QIO_CHANNEL(s->bioc), "vmstate-buffer"); in bg_migration_thread()
3854 fb = qemu_file_new_output(QIO_CHANNEL(s->bioc)); in bg_migration_thread()
3855 object_unref(OBJECT(s->bioc)); in bg_migration_thread()
3860 * Prepare for tracking memory writes with UFFD-WP - populate in bg_migration_thread()
3868 qemu_savevm_state_header(s->to_dst_file); in bg_migration_thread()
3869 ret = qemu_savevm_state_setup(s->to_dst_file, &local_err); in bg_migration_thread()
3876 * Handle SETUP failures after waiting for virtio-net-failover in bg_migration_thread()
3882 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in bg_migration_thread()
3887 s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; in bg_migration_thread()
3901 * Since we are going to get non-iterable state data directly in bg_migration_thread()
3902 * from s->bioc->data, explicit flush is needed here. in bg_migration_thread()
3913 * Start VM from BH handler to avoid write-fault lock here. in bg_migration_thread()
3914 * UFFD-WP protection for the whole RAM is already enabled so in bg_migration_thread()
3916 * writes to virtio VQs memory which is in write-protected region. in bg_migration_thread()
3945 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in bg_migration_thread()
3964 bool resume = (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP); in migration_connect()
3974 s->expected_downtime = migrate_downtime_limit(); in migration_connect()
3985 error_report_err(error_copy(s->error)); in migration_connect()
4006 qemu_file_set_blocking(s->to_dst_file, true); in migration_connect()
4010 * precopy, only if user specified "return-path" capability would in migration_connect()
4015 error_setg(&local_err, "Unable to open return-path for postcopy"); in migration_connect()
4025 if (migrate_postcopy_preempt() && s->preempt_pre_7_2) { in migration_connect()
4031 migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP, in migration_connect()
4033 qemu_sem_post(&s->postcopy_pause_sem); in migration_connect()
4040 error_setg(&local_err, "migration_stop_vm failed, error %d", -ret); in migration_connect()
4054 qemu_thread_create(&s->thread, MIGRATION_THREAD_SNAPSHOT, in migration_connect()
4057 qemu_thread_create(&s->thread, MIGRATION_THREAD_SRC_MAIN, in migration_connect()
4060 s->migration_thread_running = true; in migration_connect()
4065 if (s->state != MIGRATION_STATUS_CANCELLING) { in migration_connect()
4066 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); in migration_connect()
4076 dc->user_creatable = false; in migration_class_init()
4085 qemu_mutex_destroy(&ms->error_mutex); in migration_instance_finalize()
4086 qemu_mutex_destroy(&ms->qemu_file_lock); in migration_instance_finalize()
4087 qemu_sem_destroy(&ms->wait_unplug_sem); in migration_instance_finalize()
4088 qemu_sem_destroy(&ms->rate_limit_sem); in migration_instance_finalize()
4089 qemu_event_destroy(&ms->pause_event); in migration_instance_finalize()
4090 qemu_sem_destroy(&ms->postcopy_pause_sem); in migration_instance_finalize()
4091 qemu_sem_destroy(&ms->rp_state.rp_sem); in migration_instance_finalize()
4092 qemu_sem_destroy(&ms->rp_state.rp_pong_acks); in migration_instance_finalize()
4093 qemu_sem_destroy(&ms->postcopy_qemufile_src_sem); in migration_instance_finalize()
4094 error_free(ms->error); in migration_instance_finalize()
4101 ms->state = MIGRATION_STATUS_NONE; in migration_instance_init()
4102 ms->mbps = -1; in migration_instance_init()
4103 ms->pages_per_second = -1; in migration_instance_init()
4104 qemu_event_init(&ms->pause_event, false); in migration_instance_init()
4105 qemu_mutex_init(&ms->error_mutex); in migration_instance_init()
4107 migrate_params_init(&ms->parameters); in migration_instance_init()
4109 qemu_sem_init(&ms->postcopy_pause_sem, 0); in migration_instance_init()
4110 qemu_sem_init(&ms->rp_state.rp_sem, 0); in migration_instance_init()
4111 qemu_sem_init(&ms->rp_state.rp_pong_acks, 0); in migration_instance_init()
4112 qemu_sem_init(&ms->rate_limit_sem, 0); in migration_instance_init()
4113 qemu_sem_init(&ms->wait_unplug_sem, 0); in migration_instance_init()
4114 qemu_sem_init(&ms->postcopy_qemufile_src_sem, 0); in migration_instance_init()
4115 qemu_mutex_init(&ms->qemu_file_lock); in migration_instance_init()
4127 if (!migrate_params_check(&ms->parameters, errp)) { in migration_object_check()
4131 return migrate_caps_check(old_caps, ms->capabilities, errp); in migration_object_check()
4142 * TYPE_DEVICE's "-global" properties.