Lines Matching +full:- +full:- +full:disable +full:- +full:live +full:- +full:block +full:- +full:migration

2  * QEMU live migration
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"
21 #include "migration/blocker.h"
28 #include "system/cpu-throttle.h"
31 #include "migration/cpr.h"
32 #include "migration/global_state.h"
33 #include "migration/misc.h"
34 #include "migration.h"
35 #include "migration-stats.h"
37 #include "qemu-file.h"
39 #include "migration/vmstate.h"
40 #include "block/block.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"
56 #include "migration/colo.h"
98 /* Migration channel types */
103 dynamic creation of migration */
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()
123 * This is unfortunate: incoming migration actually needs the outgoing
124 * migration state (MigrationState) to be there too, e.g. to query
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()
239 error_setg(errp, "Migration requires seekable transport (e.g. file)"); in migration_channels_and_transport_compatible()
245 error_setg(errp, "Migration requires multi-channel URIs (e.g. tcp)"); in migration_channels_and_transport_compatible()
252 "Migration requires a transport that allows for extra fds (e.g. file)"); in migration_channels_and_transport_compatible()
257 addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in migration_channels_and_transport_compatible()
258 error_setg(errp, "Migration requires streamable transport (eg unix)"); 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()
391 * COLO thread before migration shutdown. in migration_shutdown()
395 * Cancel the current migration - that will (eventually) in migration_shutdown()
396 * stop the migration using this structure in migration_shutdown()
402 * Cancel outgoing migration of dirty bitmaps. It should in migration_shutdown()
403 * at least unref used block nodes. in migration_shutdown()
408 * Cancel incoming migration of dirty bitmaps. Dirty bitmaps 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()
453 * block the load threads from making progress on address space 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()
510 * of the migration.
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()
584 WITH_QEMU_LOCK_GUARD(&mis->page_request_mutex) { in migrate_send_rp_req_pages()
586 if (!received && !g_tree_lookup(mis->page_requested, aligned)) { in migrate_send_rp_req_pages()
592 g_tree_insert(mis->page_requested, aligned, (gpointer)1); in migrate_send_rp_req_pages()
593 qatomic_inc(&mis->page_requested_count); in migrate_send_rp_req_pages()
594 trace_postcopy_page_req_add(aligned, mis->page_requested_count); in migrate_send_rp_req_pages()
624 error_report("ENABLE_COLO command come in migration stream, but the " in migration_incoming_enable_colo()
626 return -ENOTSUP; in migration_incoming_enable_colo()
630 error_report("ENABLE_COLO command come in migration stream, but x-colo " in migration_incoming_enable_colo()
632 return -EINVAL; in migration_incoming_enable_colo()
636 error_report("COLO: cannot disable RAM discard"); in migration_incoming_enable_colo()
637 return -EBUSY; in migration_incoming_enable_colo()
647 QAPI_LIST_PREPEND(mis->socket_address_list, in migrate_add_address()
666 InetSocketAddress *isock = &addr->u.rdma; in migrate_uri_parse()
667 strList **tail = &addr->u.exec.args; in migrate_uri_parse()
670 addr->transport = MIGRATION_ADDRESS_TYPE_EXEC; in migrate_uri_parse()
676 QAPI_LIST_APPEND(tail, g_strdup("-c")); in migrate_uri_parse()
684 addr->transport = MIGRATION_ADDRESS_TYPE_RDMA; in migrate_uri_parse()
689 addr->transport = MIGRATION_ADDRESS_TYPE_SOCKET; in migrate_uri_parse()
694 addr->u.socket.type = saddr->type; in migrate_uri_parse()
695 addr->u.socket.u = saddr->u; in migrate_uri_parse()
699 addr->transport = MIGRATION_ADDRESS_TYPE_FILE; in migrate_uri_parse()
700 addr->u.file.filename = g_strdup(uri + strlen("file:")); in migrate_uri_parse()
701 if (file_parse_offset(addr->u.file.filename, &addr->u.file.offset, in migrate_uri_parse()
706 error_setg(errp, "unknown migration protocol: %s", uri); in migrate_uri_parse()
710 val->channel_type = MIGRATION_CHANNEL_TYPE_MAIN; in migrate_uri_parse()
711 val->addr = g_steal_pointer(&addr); in migrate_uri_parse()
719 MigrationStatus current = mis->state; in migration_incoming_state_setup()
723 * Incoming postcopy migration will stay in PAUSED state even if in migration_incoming_state_setup()
730 error_setg(errp, "Illegal migration incoming state: %s", in migration_incoming_state_setup()
735 migrate_set_state(&mis->state, current, MIGRATION_STATUS_SETUP); in migration_incoming_state_setup()
757 if (channels->next) { in qemu_start_incoming_migration()
762 addr = channels->value->addr; in qemu_start_incoming_migration()
770 addr = channel->addr; in qemu_start_incoming_migration()
773 /* transport mechanism not suitable for migration? */ in qemu_start_incoming_migration()
782 if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) { in qemu_start_incoming_migration()
783 SocketAddress *saddr = &addr->u.socket; in qemu_start_incoming_migration()
784 if (saddr->type == SOCKET_ADDRESS_TYPE_INET || in qemu_start_incoming_migration()
785 saddr->type == SOCKET_ADDRESS_TYPE_UNIX || in qemu_start_incoming_migration()
786 saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) { in qemu_start_incoming_migration()
788 } else if (saddr->type == SOCKET_ADDRESS_TYPE_FD) { in qemu_start_incoming_migration()
789 fd_start_incoming_migration(saddr->u.fd.str, errp); in qemu_start_incoming_migration()
792 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) { in qemu_start_incoming_migration()
793 rdma_start_incoming_migration(&addr->u.rdma, errp); in qemu_start_incoming_migration()
795 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_EXEC) { in qemu_start_incoming_migration()
796 exec_start_incoming_migration(addr->u.exec.args, errp); in qemu_start_incoming_migration()
797 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in qemu_start_incoming_migration()
798 file_start_incoming_migration(&addr->u.file, errp); in qemu_start_incoming_migration()
800 error_setg(errp, "unknown migration protocol: %s", uri); in qemu_start_incoming_migration()
811 trace_vmstate_downtime_checkpoint("dst-precopy-bh-enter"); in process_incoming_migration_bh()
817 qemu_announce_self(&mis->announce_timer, migrate_announce_params()); in process_incoming_migration_bh()
819 trace_vmstate_downtime_checkpoint("dst-precopy-bh-announced"); in process_incoming_migration_bh()
828 * Block activation is always delayed until VM starts, either in process_incoming_migration_bh()
832 * We used to have cap 'late-block-activate' but now we do this in process_incoming_migration_bh()
834 * it's not part of migration ABI on the time of disk activation. in process_incoming_migration_bh()
851 trace_vmstate_downtime_checkpoint("dst-precopy-bh-vm-started"); in process_incoming_migration_bh()
857 migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, in process_incoming_migration_bh()
871 assert(mis->from_src_file); in process_incoming_migration_co()
873 mis->largest_page_size = qemu_ram_pagesize_largest(); in process_incoming_migration_co()
875 migrate_set_state(&mis->state, MIGRATION_STATUS_SETUP, in process_incoming_migration_co()
878 mis->loadvm_co = qemu_coroutine_self(); in process_incoming_migration_co()
879 ret = qemu_loadvm_state(mis->from_src_file); in process_incoming_migration_co()
880 mis->loadvm_co = NULL; in process_incoming_migration_co()
882 trace_vmstate_downtime_checkpoint("dst-precopy-loadvm-completed"); in process_incoming_migration_co()
889 * Where a migration had postcopy enabled (and thus went to advise) in process_incoming_migration_co()
906 error_setg(&local_err, "load of migration failed: %s", strerror(-ret)); in process_incoming_migration_co()
919 migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, in process_incoming_migration_co()
926 if (mis->exit_on_error) { in process_incoming_migration_co()
927 WITH_QEMU_LOCK_GUARD(&s->error_mutex) { in process_incoming_migration_co()
928 error_report_err(s->error); in process_incoming_migration_co()
929 s->error = NULL; in process_incoming_migration_co()
940 * migration_incoming_setup: Setup incoming migration
941 * @f: file for main migration channel
947 assert(!mis->from_src_file); in migration_incoming_setup()
948 mis->from_src_file = f; in migration_incoming_setup()
958 /* Returns true if recovered from a paused migration, otherwise false */
963 if (mis->state == MIGRATION_STATUS_POSTCOPY_PAUSED) { in postcopy_try_recover()
964 /* Resumed from a paused postcopy migration */ in postcopy_try_recover()
967 assert(mis->from_src_file); in postcopy_try_recover()
969 qemu_file_set_blocking(mis->from_src_file, true); in postcopy_try_recover()
971 /* Re-configure the return path */ in postcopy_try_recover()
972 mis->to_src_file = qemu_file_get_return_path(mis->from_src_file); in postcopy_try_recover()
974 migrate_set_state(&mis->state, MIGRATION_STATUS_POSTCOPY_PAUSED, in postcopy_try_recover()
984 qemu_sem_post(&mis->postcopy_pause_sem_dst); in postcopy_try_recover()
1003 if (!mis->from_src_file) { in migration_has_main_and_multifd_channels()
1033 * avoid it for postcopy live migration. Also tls live migration in migration_ioc_process_incoming()
1049 } else if (!mis->from_src_file && in migration_ioc_process_incoming()
1050 mis->state == MIGRATION_STATUS_POSTCOPY_PAUSED) { in migration_ioc_process_incoming()
1057 } else if (mis->from_src_file && migrate_multifd()) { in migration_ioc_process_incoming()
1059 * Non-peekable channels like tls/file are processed as in migration_ioc_process_incoming()
1063 } else if (!mis->from_src_file) { in migration_ioc_process_incoming()
1066 error_setg(errp, "non-peekable channel used without multifd"); in migration_ioc_process_incoming()
1089 assert(!mis->postcopy_qemufile_dst); in migration_ioc_process_incoming()
1108 * we need for migration.
1117 if (migrate_postcopy_preempt() && !mis->postcopy_qemufile_dst) { in migration_has_all_channels()
1131 * to indicate that we've finished with the RP. Non-0 value indicates
1171 if (mis->state != MIGRATION_STATUS_POSTCOPY_RECOVER) { in migrate_send_rp_recv_bitmap()
1188 qemu_mutex_lock(&mis->rp_mutex); in migrate_send_rp_recv_bitmap()
1189 res = ramblock_recv_bitmap_send(mis->to_src_file, block_name); in migrate_send_rp_recv_bitmap()
1190 qemu_mutex_unlock(&mis->rp_mutex); in migrate_send_rp_recv_bitmap()
1211 switch (s->state) { in migration_is_running()
1233 return (s->state == MIGRATION_STATUS_ACTIVE || in migration_is_active()
1234 s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE); in migration_is_active()
1239 return (s->state == MIGRATION_STATUS_COMPLETED) || migration_in_postcopy(); in migrate_show_downtime()
1244 info->has_status = true; in populate_time_info()
1245 info->has_setup_time = true; in populate_time_info()
1246 info->setup_time = s->setup_time; in populate_time_info()
1248 if (s->state == MIGRATION_STATUS_COMPLETED) { in populate_time_info()
1249 info->has_total_time = true; in populate_time_info()
1250 info->total_time = s->total_time; in populate_time_info()
1252 info->has_total_time = true; in populate_time_info()
1253 info->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) - in populate_time_info()
1254 s->start_time; in populate_time_info()
1258 info->has_downtime = true; in populate_time_info()
1259 info->downtime = s->downtime; in populate_time_info()
1261 info->has_expected_downtime = true; in populate_time_info()
1262 info->expected_downtime = s->expected_downtime; in populate_time_info()
1270 info->ram = g_malloc0(sizeof(*info->ram)); in populate_ram_info()
1271 info->ram->transferred = migration_transferred_bytes(); in populate_ram_info()
1272 info->ram->total = ram_bytes_total(); in populate_ram_info()
1273 info->ram->duplicate = stat64_get(&mig_stats.zero_pages); in populate_ram_info()
1274 info->ram->normal = stat64_get(&mig_stats.normal_pages); in populate_ram_info()
1275 info->ram->normal_bytes = info->ram->normal * page_size; in populate_ram_info()
1276 info->ram->mbps = s->mbps; in populate_ram_info()
1277 info->ram->dirty_sync_count = in populate_ram_info()
1279 info->ram->dirty_sync_missed_zero_copy = in populate_ram_info()
1281 info->ram->postcopy_requests = in populate_ram_info()
1283 info->ram->page_size = page_size; in populate_ram_info()
1284 info->ram->multifd_bytes = stat64_get(&mig_stats.multifd_bytes); in populate_ram_info()
1285 info->ram->pages_per_second = s->pages_per_second; in populate_ram_info()
1286 info->ram->precopy_bytes = stat64_get(&mig_stats.precopy_bytes); in populate_ram_info()
1287 info->ram->downtime_bytes = stat64_get(&mig_stats.downtime_bytes); in populate_ram_info()
1288 info->ram->postcopy_bytes = stat64_get(&mig_stats.postcopy_bytes); in populate_ram_info()
1291 info->xbzrle_cache = g_malloc0(sizeof(*info->xbzrle_cache)); in populate_ram_info()
1292 info->xbzrle_cache->cache_size = migrate_xbzrle_cache_size(); in populate_ram_info()
1293 info->xbzrle_cache->bytes = xbzrle_counters.bytes; in populate_ram_info()
1294 info->xbzrle_cache->pages = xbzrle_counters.pages; in populate_ram_info()
1295 info->xbzrle_cache->cache_miss = xbzrle_counters.cache_miss; in populate_ram_info()
1296 info->xbzrle_cache->cache_miss_rate = xbzrle_counters.cache_miss_rate; in populate_ram_info()
1297 info->xbzrle_cache->encoding_rate = xbzrle_counters.encoding_rate; in populate_ram_info()
1298 info->xbzrle_cache->overflow = xbzrle_counters.overflow; in populate_ram_info()
1302 info->has_cpu_throttle_percentage = true; in populate_ram_info()
1303 info->cpu_throttle_percentage = cpu_throttle_get_percentage(); in populate_ram_info()
1306 if (s->state != MIGRATION_STATUS_COMPLETED) { in populate_ram_info()
1307 info->ram->remaining = ram_bytes_remaining(); in populate_ram_info()
1308 info->ram->dirty_pages_rate = in populate_ram_info()
1313 info->has_dirty_limit_throttle_time_per_round = true; in populate_ram_info()
1314 info->dirty_limit_throttle_time_per_round = in populate_ram_info()
1317 info->has_dirty_limit_ring_full_time = true; in populate_ram_info()
1318 info->dirty_limit_ring_full_time = dirtylimit_ring_full_time(); in populate_ram_info()
1325 int state = qatomic_read(&s->state); in fill_source_migration_info()
1328 info->blocked_reasons = NULL; in fill_source_migration_info()
1331 * There are two types of reasons a migration might be blocked; in fill_source_migration_info()
1332 * a) devices marked in VMState as non-migratable, and in fill_source_migration_info()
1333 * b) Explicit migration blockers in fill_source_migration_info()
1336 qemu_savevm_non_migratable_list(&info->blocked_reasons); in fill_source_migration_info()
1339 QAPI_LIST_PREPEND(info->blocked_reasons, in fill_source_migration_info()
1340 g_strdup(error_get_pretty(cur_blocker->data))); in fill_source_migration_info()
1343 info->has_blocked_reasons = info->blocked_reasons != NULL; in fill_source_migration_info()
1347 /* no migration has happened ever */ in fill_source_migration_info()
1348 /* do not overwrite destination migration status */ in fill_source_migration_info()
1351 info->has_status = true; in fill_source_migration_info()
1352 info->has_total_time = false; in fill_source_migration_info()
1368 info->has_status = true; in fill_source_migration_info()
1377 info->has_status = true; in fill_source_migration_info()
1380 info->has_status = true; in fill_source_migration_info()
1383 info->has_status = true; in fill_source_migration_info()
1386 info->status = state; in fill_source_migration_info()
1388 QEMU_LOCK_GUARD(&s->error_mutex); in fill_source_migration_info()
1389 if (s->error) { in fill_source_migration_info()
1390 info->error_desc = g_strdup(error_get_pretty(s->error)); in fill_source_migration_info()
1398 if (mis->socket_address_list) { in fill_destination_migration_info()
1399 info->has_socket_address = true; in fill_destination_migration_info()
1400 info->socket_address = in fill_destination_migration_info()
1401 QAPI_CLONE(SocketAddressList, mis->socket_address_list); in fill_destination_migration_info()
1404 switch (mis->state) { in fill_destination_migration_info()
1414 info->has_status = true; in fill_destination_migration_info()
1417 info->has_status = true; in fill_destination_migration_info()
1423 info->status = mis->state; in fill_destination_migration_info()
1425 if (!info->error_desc) { in fill_destination_migration_info()
1427 QEMU_LOCK_GUARD(&s->error_mutex); in fill_destination_migration_info()
1429 if (s->error) { in fill_destination_migration_info()
1430 info->error_desc = g_strdup(error_get_pretty(s->error)); in fill_destination_migration_info()
1451 " the start of migration"); in qmp_migrate_start_postcopy()
1455 if (s->state == MIGRATION_STATUS_NONE) { in qmp_migrate_start_postcopy()
1456 error_setg(errp, "Postcopy must be started after migration has been" in qmp_migrate_start_postcopy()
1461 * we don't error if migration has finished since that would be racy in qmp_migrate_start_postcopy()
1464 qatomic_set(&s->start_postcopy, true); in qmp_migrate_start_postcopy()
1467 /* shared migration helpers */
1481 g_clear_pointer(&s->vmdesc, json_writer_free); in migration_cleanup_json_writer()
1493 g_free(s->hostname); in migration_cleanup()
1494 s->hostname = NULL; in migration_cleanup()
1502 if (s->migration_thread_running) { in migration_cleanup()
1504 qemu_thread_join(&s->thread); in migration_cleanup()
1505 s->migration_thread_running = false; in migration_cleanup()
1509 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_cleanup()
1512 * section won't block for long. in migration_cleanup()
1514 tmp = s->to_dst_file; in migration_cleanup()
1515 s->to_dst_file = NULL; in migration_cleanup()
1531 if (s->state == MIGRATION_STATUS_CANCELLING) { in migration_cleanup()
1532 migrate_set_state(&s->state, MIGRATION_STATUS_CANCELLING, in migration_cleanup()
1536 if (s->error) { in migration_cleanup()
1538 error_report_err(error_copy(s->error)); in migration_cleanup()
1553 QEMU_LOCK_GUARD(&s->error_mutex); in migrate_set_error()
1557 if (!s->error) { in migrate_set_error()
1558 s->error = error_copy(error); in migrate_set_error()
1565 QEMU_LOCK_GUARD(&s->error_mutex); in migrate_has_error()
1566 return qatomic_read(&s->error); in migrate_has_error()
1571 QEMU_LOCK_GUARD(&s->error_mutex); in migrate_error_free()
1572 if (s->error) { in migrate_error_free()
1573 error_free(s->error); in migrate_error_free()
1574 s->error = NULL; in migrate_error_free()
1580 MigrationStatus current = s->state; in migration_connect_set_error()
1583 assert(s->to_dst_file == NULL); in migration_connect_set_error()
1590 /* Never fail a postcopy migration; switch back to PAUSED instead */ in migration_connect_set_error()
1598 error_report("%s: Illegal migration status (%s) detected", in migration_connect_set_error()
1603 migrate_set_state(&s->state, current, next); in migration_connect_set_error()
1611 bool setup = (s->state == MIGRATION_STATUS_SETUP); in migration_cancel()
1616 qmp_cancel_vcpu_dirty_limit(false, -1, NULL); in migration_cancel()
1619 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_cancel()
1620 if (s->rp_state.from_dst_file) { in migration_cancel()
1622 qemu_file_shutdown(s->rp_state.from_dst_file); in migration_cancel()
1627 old_state = s->state; in migration_cancel()
1631 /* If the migration is paused, kick it out of the pause */ in migration_cancel()
1633 qemu_event_set(&s->pause_event); in migration_cancel()
1635 migrate_set_state(&s->state, old_state, MIGRATION_STATUS_CANCELLING); in migration_cancel()
1636 } while (s->state != MIGRATION_STATUS_CANCELLING); in migration_cancel()
1639 * If we're unlucky the migration code might be stuck somewhere in a in migration_cancel()
1643 if (s->state == MIGRATION_STATUS_CANCELLING) { in migration_cancel()
1644 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_cancel()
1645 if (s->to_dst_file) { in migration_cancel()
1646 qemu_file_shutdown(s->to_dst_file); in migration_cancel()
1655 if (setup && !s->to_dst_file) { in migration_cancel()
1656 migrate_set_state(&s->state, MIGRATION_STATUS_CANCELLING, in migration_cancel()
1666 notify->notify = (NotifierWithReturnFunc)func; in migration_add_notifier_mode()
1678 if (notify->notify) { in migration_remove_notifier()
1680 notify->notify = NULL; in migration_remove_notifier()
1687 MigMode mode = s->parameters.mode; in migration_call_notifiers()
1700 return (s->state == MIGRATION_STATUS_CANCELLED || in migration_has_failed()
1701 s->state == MIGRATION_STATUS_FAILED); in migration_has_failed()
1708 switch (s->state) { in migration_in_postcopy()
1753 return qemu_thread_is_self(&s->thread); in migration_thread_is_self()
1758 MigMode mode = s->parameters.mode; in migrate_mode_is_cpr()
1773 * Reinitialise all migration state, except in migrate_init()
1777 s->to_dst_file = NULL; in migrate_init()
1778 s->state = MIGRATION_STATUS_NONE; in migrate_init()
1779 s->rp_state.from_dst_file = NULL; in migrate_init()
1780 s->mbps = 0.0; in migrate_init()
1781 s->pages_per_second = 0.0; in migrate_init()
1782 s->downtime = 0; in migrate_init()
1783 s->expected_downtime = 0; in migrate_init()
1784 s->setup_time = 0; in migrate_init()
1785 s->start_postcopy = false; in migrate_init()
1786 s->migration_thread_running = false; in migrate_init()
1787 error_free(s->error); in migrate_init()
1788 s->error = NULL; in migrate_init()
1791 s->vmdesc = json_writer_new(false); in migrate_init()
1794 migrate_set_state(&s->state, MIGRATION_STATUS_NONE, MIGRATION_STATUS_SETUP); in migrate_init()
1796 s->start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); in migrate_init()
1797 s->total_time = 0; in migrate_init()
1798 s->vm_old_state = -1; in migrate_init()
1799 s->iteration_initial_bytes = 0; in migrate_init()
1800 s->threshold_size = 0; in migrate_init()
1801 s->switchover_acked = false; in migrate_init()
1802 s->rdma_migration = false; in migrate_init()
1804 * set mig_stats memory to zero for a new migration in migrate_init()
1819 "disallowing migration blocker " in is_busy()
1820 "(migration/snapshot in progress) for: "); in is_busy()
1833 "disallowing migration blocker " in is_only_migratable()
1834 "(--only-migratable) for: "); in is_only_migratable()
1845 while (mode != -1 && mode != MIG_MODE_ALL) { in get_modes()
1851 modes = BIT(MIG_MODE__MAX) - 1; in get_modes()
1874 return migrate_add_blocker_modes(reasonp, errp, MIG_MODE_NORMAL, -1); in migrate_add_blocker_normal()
1887 return -EACCES; in migrate_add_blocker_modes()
1889 return -EBUSY; in migrate_add_blocker_modes()
1896 int modes = BIT(MIG_MODE__MAX) - 1; in migrate_add_blocker_internal()
1899 return -EBUSY; in migrate_add_blocker_internal()
1926 error_setg(errp, "The incoming migration has already been started"); in qmp_migrate_incoming()
1930 error_setg(errp, "'-incoming' was not specified on the command line"); in qmp_migrate_incoming()
1938 mis->exit_on_error = in qmp_migrate_incoming()
1950 * Making sure MigrationState is available until incoming migration in qmp_migrate_incoming()
1974 if (mis->state != MIGRATION_STATUS_POSTCOPY_PAUSED) { in qmp_migrate_recover()
1984 * Note that this call will never start a real migration; it will in qmp_migrate_recover()
1985 * only re-setup the migration stream and poke existing migration in qmp_migrate_recover()
1997 if (migration_postcopy_is_alive(ms->state)) { in qmp_migrate_pause()
2001 /* Tell the core migration that we're pausing */ in qmp_migrate_pause()
2002 error_setg(&error, "Postcopy migration is paused by the user"); in qmp_migrate_pause()
2006 qemu_mutex_lock(&ms->qemu_file_lock); in qmp_migrate_pause()
2007 if (ms->to_dst_file) { in qmp_migrate_pause()
2008 ret = qemu_file_shutdown(ms->to_dst_file); in qmp_migrate_pause()
2010 qemu_mutex_unlock(&ms->qemu_file_lock); in qmp_migrate_pause()
2012 error_setg(errp, "Failed to pause source migration"); in qmp_migrate_pause()
2016 * Kick the migration thread out of any waiting windows (on behalf in qmp_migrate_pause()
2024 if (migration_postcopy_is_alive(mis->state)) { in qmp_migrate_pause()
2025 ret = qemu_file_shutdown(mis->from_src_file); in qmp_migrate_pause()
2027 error_setg(errp, "Failed to pause destination migration"); in qmp_migrate_pause()
2032 error_setg(errp, "migrate-pause is currently only supported " in qmp_migrate_pause()
2033 "during postcopy-active or postcopy-recover state"); in qmp_migrate_pause()
2045 error_propagate(errp, error_copy(blockers->data)); in migration_is_blocked()
2056 if (s->state != MIGRATION_STATUS_POSTCOPY_PAUSED) { in migrate_prepare()
2058 "paused migration"); in migrate_prepare()
2063 * Postcopy recovery won't work well with release-ram in migrate_prepare()
2064 * capability since release-ram will drop the page buffer as in migrate_prepare()
2069 * the client from resuming such a postcopy migration. in migrate_prepare()
2070 * Luckily release-ram was designed to only be used when src in migrate_prepare()
2076 "when release-ram capability is set"); in migrate_prepare()
2080 migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_PAUSED, in migrate_prepare()
2088 error_setg(errp, "There's a migration process in progress"); in migrate_prepare()
2093 error_setg(errp, "Guest is waiting for an incoming migration"); in migrate_prepare()
2099 "previous migration"); in migrate_prepare()
2115 error_setg(errp, "Cannot use TLS with mapped-ram"); in migrate_prepare()
2120 error_setg(errp, "Cannot use compression with mapped-ram"); in migrate_prepare()
2155 s->hup_source = qio_channel_create_watch(ioc, G_IO_HUP); in migrate_hup_add()
2156 g_source_set_callback(s->hup_source, cb, opaque, NULL); in migrate_hup_add()
2157 g_source_attach(s->hup_source, NULL); in migrate_hup_add()
2162 if (s->hup_source) { in migrate_hup_delete()
2163 g_source_destroy(s->hup_source); in migrate_hup_delete()
2164 g_source_unref(s->hup_source); in migrate_hup_delete()
2165 s->hup_source = NULL; in migrate_hup_delete()
2204 for ( ; channels; channels = channels->next) { in qmp_migrate()
2205 MigrationChannelType type = channels->value->channel_type; in qmp_migrate()
2212 channelv[type] = channels->value; in qmp_migrate()
2215 addr = channelv[MIGRATION_CHANNEL_TYPE_MAIN]->addr; in qmp_migrate()
2227 addr = channel->addr; in qmp_migrate()
2230 /* transport mechanism not suitable for migration? */ in qmp_migrate()
2235 if (s->parameters.mode == MIG_MODE_CPR_TRANSFER && !cpr_channel) { in qmp_migrate()
2236 error_setg(errp, "missing 'cpr' migration channel"); in qmp_migrate()
2251 * For cpr-transfer, the target may not be listening yet on the migration in qmp_migrate()
2253 * us it is listening by closing the cpr-state socket. Wait for that HUP in qmp_migrate()
2257 * in which case the target will not listen for the incoming migration in qmp_migrate()
2260 if (s->parameters.mode == MIG_MODE_CPR_TRANSFER) { in qmp_migrate()
2287 if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) { in qmp_migrate_finish()
2288 SocketAddress *saddr = &addr->u.socket; in qmp_migrate_finish()
2289 if (saddr->type == SOCKET_ADDRESS_TYPE_INET || in qmp_migrate_finish()
2290 saddr->type == SOCKET_ADDRESS_TYPE_UNIX || in qmp_migrate_finish()
2291 saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) { in qmp_migrate_finish()
2293 } else if (saddr->type == SOCKET_ADDRESS_TYPE_FD) { in qmp_migrate_finish()
2294 fd_start_outgoing_migration(s, saddr->u.fd.str, &local_err); in qmp_migrate_finish()
2297 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) { in qmp_migrate_finish()
2298 rdma_start_outgoing_migration(s, &addr->u.rdma, &local_err); in qmp_migrate_finish()
2300 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_EXEC) { in qmp_migrate_finish()
2301 exec_start_outgoing_migration(s, addr->u.exec.args, &local_err); in qmp_migrate_finish()
2302 } else if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) { in qmp_migrate_finish()
2303 file_start_outgoing_migration(s, &addr->u.file, &local_err); in qmp_migrate_finish()
2306 "a valid migration protocol"); in qmp_migrate_finish()
2307 migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, in qmp_migrate_finish()
2324 * After postcopy migration has started, the source machine is not in qmp_migrate_cancel()
2325 * recoverable in case of a migration error. This also means the in qmp_migrate_cancel()
2330 error_setg(errp, "Postcopy migration in progress, cannot cancel."); in qmp_migrate_cancel()
2340 if (s->state != state) { in qmp_migrate_continue()
2341 error_setg(errp, "Migration not in expected state: %s", in qmp_migrate_continue()
2342 MigrationStatus_str(s->state)); in qmp_migrate_continue()
2345 qemu_event_set(&s->pause_event); in qmp_migrate_continue()
2350 /* If migration has failure already, ignore the wait */ in migration_rp_wait()
2352 return -1; in migration_rp_wait()
2355 qemu_sem_wait(&s->rp_state.rp_sem); in migration_rp_wait()
2359 return -1; in migration_rp_wait()
2367 qemu_sem_post(&s->rp_state.rp_sem); in migration_rp_kick()
2371 ssize_t len; /* -1 = variable */
2374 [MIG_RP_MSG_INVALID] = { .len = -1, .name = "INVALID" },
2378 [MIG_RP_MSG_REQ_PAGES_ID] = { .len = -1, .name = "REQ_PAGES_ID" },
2379 [MIG_RP_MSG_RECV_BITMAP] = { .len = -1, .name = "RECV_BITMAP" },
2382 [MIG_RP_MSG_MAX] = { .len = -1, .name = "MAX" },
2415 RAMBlock *block = qemu_ram_block_by_name(block_name); in migrate_handle_rp_recv_bitmap() local
2417 if (!block) { in migrate_handle_rp_recv_bitmap()
2418 error_setg(errp, "MIG_RP_MSG_RECV_BITMAP has invalid block name '%s'", in migrate_handle_rp_recv_bitmap()
2424 return ram_dirty_bitmap_reload(s, block, errp); in migrate_handle_rp_recv_bitmap()
2438 migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_RECOVER, in migrate_handle_rp_resume_ack()
2448 * Release ms->rp_state.from_dst_file (and postcopy_qemufile_src if
2455 WITH_QEMU_LOCK_GUARD(&ms->qemu_file_lock) { in migration_release_dst_files()
2458 * can't block within lock section in migration_release_dst_files()
2460 file = ms->rp_state.from_dst_file; in migration_release_dst_files()
2461 ms->rp_state.from_dst_file = NULL; in migration_release_dst_files()
2469 if (ms->postcopy_qemufile_src) { in migration_release_dst_files()
2470 migration_ioc_unregister_yank_from_file(ms->postcopy_qemufile_src); in migration_release_dst_files()
2471 qemu_file_shutdown(ms->postcopy_qemufile_src); in migration_release_dst_files()
2472 qemu_fclose(ms->postcopy_qemufile_src); in migration_release_dst_files()
2473 ms->postcopy_qemufile_src = NULL; in migration_release_dst_files()
2486 QEMUFile *rp = ms->rp_state.from_dst_file; in source_return_path_thread()
2516 if ((rp_cmd_args[header_type].len != -1 && in source_return_path_thread()
2553 qemu_sem_post(&ms->rp_state.rp_pong_acks); in source_return_path_thread()
2590 error_setg(&err, "MIG_RP_MSG_RECV_BITMAP missing block name"); in source_return_path_thread()
2608 ms->switchover_acked = true; in source_return_path_thread()
2624 if (ms->state == MIGRATION_STATUS_POSTCOPY_RECOVER) { in source_return_path_thread()
2628 * period the main migration thread can be waiting on rp_sem for in source_return_path_thread()
2631 * When this happens, explicitly kick the migration thread out of in source_return_path_thread()
2646 ms->rp_state.from_dst_file = qemu_file_get_return_path(ms->to_dst_file); in open_return_path_on_source()
2647 if (!ms->rp_state.from_dst_file) { in open_return_path_on_source()
2648 return -1; in open_return_path_on_source()
2653 qemu_thread_create(&ms->rp_state.rp_thread, MIGRATION_THREAD_SRC_RETURN, in open_return_path_on_source()
2655 ms->rp_state.rp_thread_created = true; in open_return_path_on_source()
2665 if (!ms->rp_state.rp_thread_created) { in close_return_path_on_source()
2677 WITH_QEMU_LOCK_GUARD(&ms->qemu_file_lock) { in close_return_path_on_source()
2678 if (migrate_has_error(ms) && ms->rp_state.from_dst_file) { in close_return_path_on_source()
2679 qemu_file_shutdown(ms->rp_state.from_dst_file); in close_return_path_on_source()
2683 qemu_thread_join(&ms->rp_state.rp_thread); in close_return_path_on_source()
2684 ms->rp_state.rp_thread_created = false; in close_return_path_on_source()
2696 qemu_sem_wait(&ms->rp_state.rp_pong_acks); in migration_wait_main_channel()
2701 * Returns non-0 on error
2720 if (ms->state != MIGRATION_STATUS_CANCELLING) { in postcopy_start()
2721 migrate_set_state(&ms->state, ms->state, in postcopy_start()
2726 return -1; in postcopy_start()
2730 if (!qemu_savevm_state_postcopy_prepare(ms->to_dst_file, errp)) { in postcopy_start()
2731 return -1; in postcopy_start()
2740 error_setg_errno(errp, -ret, "%s: Failed to stop the VM", __func__); in postcopy_start()
2749 * Cause any non-postcopiable, but iterative devices to in postcopy_start()
2752 ret = qemu_savevm_state_complete_precopy_iterable(ms->to_dst_file, true); in postcopy_start()
2754 error_setg(errp, "Postcopy save non-postcopiable iterables failed"); in postcopy_start()
2759 * in Finish migrate and with the io-lock held everything should in postcopy_start()
2770 qemu_savevm_send_ping(ms->to_dst_file, 2); in postcopy_start()
2777 * it starts processing it. Unfortunately the ad-hoc migration format in postcopy_start()
2779 * parsing it through each devices load-state code (especially the open in postcopy_start()
2785 qio_channel_set_name(QIO_CHANNEL(bioc), "migration-postcopy-buffer"); in postcopy_start()
2797 error_setg(errp, "Postcopy save non-iterable device states failed"); in postcopy_start()
2813 ret = qemu_file_get_error(ms->to_dst_file); in postcopy_start()
2815 error_setg(errp, "postcopy_start: Migration stream errored (pre package)"); in postcopy_start()
2820 if (qemu_savevm_send_packaged(ms->to_dst_file, bioc->data, bioc->usage)) { in postcopy_start()
2839 qemu_savevm_send_ping(ms->to_dst_file, 4); in postcopy_start()
2846 ret = qemu_file_get_error(ms->to_dst_file); in postcopy_start()
2848 error_setg_errno(errp, -ret, "postcopy_start: Migration stream error"); in postcopy_start()
2859 /* Now, switchover looks all fine, switching to postcopy-active */ in postcopy_start()
2860 migrate_set_state(&ms->state, MIGRATION_STATUS_DEVICE, in postcopy_start()
2870 migrate_set_state(&ms->state, MIGRATION_STATUS_POSTCOPY_ACTIVE, in postcopy_start()
2875 return -1; in postcopy_start()
2881 * @s: The migration state object pointer
2883 * Prepares for the switchover, depending on "pause-before-switchover"
2887 * [postcopy-]active -> pre-switchover -> device
2890 * [postcopy-]active -> device
2897 if (s->state == MIGRATION_STATUS_CANCELLING) { in migration_switchover_prepare()
2910 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_DEVICE); in migration_switchover_prepare()
2919 qemu_event_reset(&s->pause_event); in migration_switchover_prepare()
2922 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_PRE_SWITCHOVER); in migration_switchover_prepare()
2925 qemu_event_wait(&s->pause_event); in migration_switchover_prepare()
2931 * pre-switchover. in migration_switchover_prepare()
2933 migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER, in migration_switchover_prepare()
2936 return s->state == MIGRATION_STATUS_DEVICE; in migration_switchover_prepare()
2955 error_setg(errp, "Block inactivate failed during switchover"); in migration_switchover_start()
2964 qemu_savevm_maybe_send_switchover_start(s->to_dst_file); in migration_switchover_start()
2983 ret = -EFAULT; in migration_completion_precopy()
2987 ret = qemu_savevm_state_complete_precopy(s->to_dst_file, false); in migration_completion_precopy()
2998 qemu_savevm_state_complete_postcopy(s->to_dst_file); in migration_completion_postcopy()
3005 if (migrate_postcopy_preempt() && s->preempt_pre_7_2) { in migration_completion_postcopy()
3016 * @s: Current migration state
3023 if (s->state == MIGRATION_STATUS_ACTIVE) { in migration_completion()
3025 } else if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { in migration_completion()
3028 ret = -1; in migration_completion()
3039 if (qemu_file_get_error(s->to_dst_file)) { in migration_completion()
3044 if (migrate_colo() && s->state == MIGRATION_STATUS_ACTIVE) { in migration_completion()
3046 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in migration_completion()
3055 if (qemu_file_get_error_obj(s->to_dst_file, &local_err)) { in migration_completion()
3059 error_setg_errno(&local_err, -ret, "Error in migration completion"); in migration_completion()
3064 if (s->state != MIGRATION_STATUS_CANCELLING) { in migration_completion()
3065 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); in migration_completion()
3073 * @s: Current migration state
3077 int current_active_state = s->state; in bg_migration_completion()
3079 if (s->state == MIGRATION_STATUS_ACTIVE) { in bg_migration_completion()
3081 * By this moment we have RAM content saved into the migration stream. in bg_migration_completion()
3082 * The next step is to flush the non-RAM content (device state) in bg_migration_completion()
3086 qemu_put_buffer(s->to_dst_file, s->bioc->data, s->bioc->usage); in bg_migration_completion()
3087 qemu_fflush(s->to_dst_file); in bg_migration_completion()
3088 } else if (s->state == MIGRATION_STATUS_CANCELLING) { in bg_migration_completion()
3092 if (qemu_file_get_error(s->to_dst_file)) { in bg_migration_completion()
3101 migrate_set_state(&s->state, current_active_state, in bg_migration_completion()
3116 qemu_savevm_send_postcopy_resume(s->to_dst_file); in postcopy_resume_handshake()
3118 while (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) { in postcopy_resume_handshake()
3120 return -1; in postcopy_resume_handshake()
3124 if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { in postcopy_resume_handshake()
3128 return -1; in postcopy_resume_handshake()
3138 * ready for the migration resume. in postcopy_do_resume()
3148 * If preempt is enabled, re-establish the preempt channel. Note that in postcopy_do_resume()
3163 * switch to postcopy-active afterwards) in postcopy_do_resume()
3176 * postcopy migration. Returns MIG_THR_ERR_RECOVERED if recovered, or
3181 assert(s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE); in postcopy_pause()
3189 * re-created when we resume. in postcopy_pause()
3196 * modified by the migration thread. That also guarantees that the in postcopy_pause()
3202 assert(s->to_dst_file); in postcopy_pause()
3203 migration_ioc_unregister_yank_from_file(s->to_dst_file); in postcopy_pause()
3204 qemu_mutex_lock(&s->qemu_file_lock); in postcopy_pause()
3205 file = s->to_dst_file; in postcopy_pause()
3206 s->to_dst_file = NULL; in postcopy_pause()
3207 qemu_mutex_unlock(&s->qemu_file_lock); in postcopy_pause()
3212 migrate_set_state(&s->state, s->state, in postcopy_pause()
3216 "Migration paused."); in postcopy_pause()
3223 qemu_sem_wait(&s->postcopy_pause_sem); in postcopy_pause()
3224 } while (postcopy_is_paused(s->state)); in postcopy_pause()
3226 if (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) { in postcopy_pause()
3253 WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) { in migration_file_set_error()
3254 if (s->to_dst_file) { in migration_file_set_error()
3255 qemu_file_set_error_obj(s->to_dst_file, ret, err); in migration_file_set_error()
3265 int state = s->state; in migration_detect_error()
3270 /* End the migration, but don't set the state to failed */ in migration_detect_error()
3278 ret = qemu_file_get_error_obj_any(s->to_dst_file, in migration_detect_error()
3279 s->postcopy_qemufile_src, in migration_detect_error()
3304 migrate_set_state(&s->state, state, MIGRATION_STATUS_FAILED); in migration_detect_error()
3307 /* Time to stop the migration, now. */ in migration_detect_error()
3319 * Take the BQL here so that query-migrate on the QMP thread sees: in migration_completion_end()
3320 * - atomic update of s->total_time and s->mbps; in migration_completion_end()
3321 * - correct ordering of s->mbps update vs. s->state; in migration_completion_end()
3325 s->total_time = end_time - s->start_time; in migration_completion_end()
3326 transfer_time = s->total_time - s->setup_time; in migration_completion_end()
3328 s->mbps = ((double) bytes * 8.0) / transfer_time / 1000; in migration_completion_end()
3331 migrate_set_state(&s->state, s->state, in migration_completion_end()
3342 s->iteration_start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); in update_iteration_initial_status()
3343 s->iteration_initial_bytes = migration_transferred_bytes(); in update_iteration_initial_status()
3344 s->iteration_initial_pages = ram_get_total_transferred_pages(); in update_iteration_initial_status()
3357 if (current_time < s->iteration_start_time + BUFFER_DELAY) { in migration_update_counters()
3363 transferred = current_bytes - s->iteration_initial_bytes; in migration_update_counters()
3364 time_spent = current_time - s->iteration_start_time; in migration_update_counters()
3378 s->threshold_size = expected_bw_per_ms * migrate_downtime_limit(); in migration_update_counters()
3380 s->mbps = (((double) transferred * 8.0) / in migration_update_counters()
3383 transferred_pages = ram_get_total_transferred_pages() - in migration_update_counters()
3384 s->iteration_initial_pages; in migration_update_counters()
3385 s->pages_per_second = (double) transferred_pages / in migration_update_counters()
3394 s->expected_downtime = in migration_update_counters()
3405 s->threshold_size); in migration_update_counters()
3419 return s->switchover_acked; in migration_can_switchover()
3422 /* Migration thread iteration status */
3437 bool in_postcopy = s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE; in migration_iteration_run()
3444 if (pending_size < s->threshold_size) { in migration_iteration_run()
3450 if ((!pending_size || pending_size < s->threshold_size) && can_switchover) { in migration_iteration_run()
3457 if (!in_postcopy && must_precopy <= s->threshold_size && can_switchover && in migration_iteration_run()
3458 qatomic_read(&s->start_postcopy)) { in migration_iteration_run()
3467 qemu_savevm_state_iterate(s->to_dst_file, in_postcopy); in migration_iteration_run()
3476 * If we enabled cpu throttling for auto-converge, turn it off. in migration_iteration_finish()
3484 switch (s->state) { in migration_iteration_finish()
3491 s->vm_old_state = RUN_STATE_RUNNING; in migration_iteration_finish()
3497 * Re-activate the block drives if they're inactivated. Note, COLO in migration_iteration_finish()
3498 * shouldn't use block_active at all, so it should be no-op there. in migration_iteration_finish()
3501 if (runstate_is_live(s->vm_old_state)) { in migration_iteration_finish()
3507 runstate_set(s->vm_old_state); in migration_iteration_finish()
3514 error_report("%s: Unknown ending state %d", __func__, s->state); in migration_iteration_finish()
3525 * Stop tracking RAM writes - un-protect memory, un-register UFFD in bg_migration_iteration_finish()
3532 switch (s->state) { in bg_migration_iteration_finish()
3542 error_report("%s: Unknown ending state %d", __func__, s->state); in bg_migration_iteration_finish()
3558 res = qemu_savevm_state_iterate(s->to_dst_file, false); in bg_migration_iteration_run()
3569 qemu_sem_post(&migrate_get_current()->rate_limit_sem); in migration_make_urgent_request()
3574 qemu_sem_wait(&migrate_get_current()->rate_limit_sem); in migration_consume_urgent_request()
3585 if (migration_rate_exceeded(s->to_dst_file)) { in migration_rate_limit()
3587 if (qemu_file_get_error(s->to_dst_file)) { in migration_rate_limit()
3594 int ms = s->iteration_start_time + BUFFER_DELAY - now; in migration_rate_limit()
3596 if (qemu_sem_timedwait(&s->rate_limit_sem, ms) == 0) { in migration_rate_limit()
3604 qemu_sem_post(&s->rate_limit_sem); in migration_rate_limit()
3621 migrate_set_state(&s->state, old_state, MIGRATION_STATUS_WAIT_UNPLUG); in qemu_savevm_wait_unplug()
3623 while (s->state == MIGRATION_STATUS_WAIT_UNPLUG && in qemu_savevm_wait_unplug()
3625 qemu_sem_timedwait(&s->wait_unplug_sem, 250); in qemu_savevm_wait_unplug()
3627 if (s->state != MIGRATION_STATUS_WAIT_UNPLUG) { in qemu_savevm_wait_unplug()
3630 * migration has been canceled in qemu_savevm_wait_unplug()
3634 while (timeout-- && qemu_savevm_state_guest_unplug_pending()) { in qemu_savevm_wait_unplug()
3635 qemu_sem_timedwait(&s->wait_unplug_sem, 250); in qemu_savevm_wait_unplug()
3639 warn_report("migration: partially unplugged device on " in qemu_savevm_wait_unplug()
3644 migrate_set_state(&s->state, MIGRATION_STATUS_WAIT_UNPLUG, new_state); in qemu_savevm_wait_unplug()
3646 migrate_set_state(&s->state, old_state, new_state); in qemu_savevm_wait_unplug()
3651 * Master migration thread on the source VM.
3652 * It drives the migration and pumps the data down the outgoing channel.
3676 qemu_savevm_state_header(s->to_dst_file); in migration_thread()
3683 if (s->rp_state.rp_thread_created) { in migration_thread()
3685 qemu_savevm_send_open_return_path(s->to_dst_file); in migration_thread()
3688 qemu_savevm_send_ping(s->to_dst_file, 1); in migration_thread()
3697 qemu_savevm_send_postcopy_advise(s->to_dst_file); in migration_thread()
3701 /* Notify migration destination that we enable COLO */ in migration_thread()
3702 qemu_savevm_send_colo_enable(s->to_dst_file); in migration_thread()
3711 ret = qemu_savevm_state_setup(s->to_dst_file, &local_err); in migration_thread()
3718 * Handle SETUP failures after waiting for virtio-net-failover in migration_thread()
3719 * devices to unplug. This to preserve migration state transitions. in migration_thread()
3724 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in migration_thread()
3729 s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; in migration_thread()
3734 if (urgent || !migration_rate_exceeded(s->to_dst_file)) { in migration_thread()
3745 * should stop the migration now. in migration_thread()
3749 /* Stop migration */ in migration_thread()
3776 vm_resume(s->vm_old_state); in bg_migration_vm_start_bh()
3781 * Background snapshot thread, based on live migration code.
3782 * This is an alternative implementation of live migration mechanism
3786 * in v5.7 kernel. Compared to existing dirty page logging migration much
3811 * We want to save vmstate for the moment when migration has been in bg_migration_thread()
3814 * stash the non-RAM part of the vmstate to the temporary buffer, in bg_migration_thread()
3815 * then write RAM part of the vmstate to the migration stream in bg_migration_thread()
3816 * with vCPUs running and, finally, write stashed non-RAM part of in bg_migration_thread()
3817 * the vmstate from the buffer to the migration stream. in bg_migration_thread()
3819 s->bioc = qio_channel_buffer_new(512 * 1024); in bg_migration_thread()
3820 qio_channel_set_name(QIO_CHANNEL(s->bioc), "vmstate-buffer"); in bg_migration_thread()
3821 fb = qemu_file_new_output(QIO_CHANNEL(s->bioc)); in bg_migration_thread()
3822 object_unref(OBJECT(s->bioc)); in bg_migration_thread()
3827 * Prepare for tracking memory writes with UFFD-WP - populate in bg_migration_thread()
3835 qemu_savevm_state_header(s->to_dst_file); in bg_migration_thread()
3836 ret = qemu_savevm_state_setup(s->to_dst_file, &local_err); in bg_migration_thread()
3843 * Handle SETUP failures after waiting for virtio-net-failover in bg_migration_thread()
3844 * devices to unplug. This to preserve migration state transitions. in bg_migration_thread()
3849 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in bg_migration_thread()
3854 s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; in bg_migration_thread()
3868 * Since we are going to get non-iterable state data directly in bg_migration_thread()
3869 * from s->bioc->data, explicit flush is needed here. in bg_migration_thread()
3880 * Start VM from BH handler to avoid write-fault lock here. in bg_migration_thread()
3881 * UFFD-WP protection for the whole RAM is already enabled so in bg_migration_thread()
3883 * writes to virtio VQs memory which is in write-protected region. in bg_migration_thread()
3898 * should stop the migration now. in bg_migration_thread()
3902 /* Stop migration */ in bg_migration_thread()
3913 migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, in bg_migration_thread()
3932 bool resume = (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP); in migration_connect()
3937 * Meanwhile if migration completes successfully, there won't have an error in migration_connect()
3942 s->expected_downtime = migrate_downtime_limit(); in migration_connect()
3953 error_report_err(error_copy(s->error)); in migration_connect()
3961 /* This is a resumed migration */ in migration_connect()
3964 /* This is a fresh new migration */ in migration_connect()
3967 /* Notify before starting migration thread */ in migration_connect()
3974 qemu_file_set_blocking(s->to_dst_file, true); in migration_connect()
3978 * precopy, only if user specified "return-path" capability would in migration_connect()
3983 error_setg(&local_err, "Unable to open return-path for postcopy"); in migration_connect()
3993 if (migrate_postcopy_preempt() && s->preempt_pre_7_2) { in migration_connect()
3998 /* Wakeup the main migration thread to do the recovery */ in migration_connect()
3999 migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP, in migration_connect()
4001 qemu_sem_post(&s->postcopy_pause_sem); in migration_connect()
4008 error_setg(&local_err, "migration_stop_vm failed, error %d", -ret); in migration_connect()
4014 * Take a refcount to make sure the migration object won't get freed by in migration_connect()
4022 qemu_thread_create(&s->thread, MIGRATION_THREAD_SNAPSHOT, in migration_connect()
4025 qemu_thread_create(&s->thread, MIGRATION_THREAD_SRC_MAIN, in migration_connect()
4028 s->migration_thread_running = true; in migration_connect()
4033 if (s->state != MIGRATION_STATUS_CANCELLING) { in migration_connect()
4034 migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); in migration_connect()
4044 dc->user_creatable = false; in migration_class_init()
4053 qemu_mutex_destroy(&ms->error_mutex); in migration_instance_finalize()
4054 qemu_mutex_destroy(&ms->qemu_file_lock); in migration_instance_finalize()
4055 qemu_sem_destroy(&ms->wait_unplug_sem); in migration_instance_finalize()
4056 qemu_sem_destroy(&ms->rate_limit_sem); in migration_instance_finalize()
4057 qemu_event_destroy(&ms->pause_event); in migration_instance_finalize()
4058 qemu_sem_destroy(&ms->postcopy_pause_sem); in migration_instance_finalize()
4059 qemu_sem_destroy(&ms->rp_state.rp_sem); in migration_instance_finalize()
4060 qemu_sem_destroy(&ms->rp_state.rp_pong_acks); in migration_instance_finalize()
4061 qemu_sem_destroy(&ms->postcopy_qemufile_src_sem); in migration_instance_finalize()
4062 error_free(ms->error); in migration_instance_finalize()
4069 ms->state = MIGRATION_STATUS_NONE; in migration_instance_init()
4070 ms->mbps = -1; in migration_instance_init()
4071 ms->pages_per_second = -1; in migration_instance_init()
4072 qemu_event_init(&ms->pause_event, false); in migration_instance_init()
4073 qemu_mutex_init(&ms->error_mutex); in migration_instance_init()
4075 migrate_params_init(&ms->parameters); in migration_instance_init()
4077 qemu_sem_init(&ms->postcopy_pause_sem, 0); in migration_instance_init()
4078 qemu_sem_init(&ms->rp_state.rp_sem, 0); in migration_instance_init()
4079 qemu_sem_init(&ms->rp_state.rp_pong_acks, 0); in migration_instance_init()
4080 qemu_sem_init(&ms->rate_limit_sem, 0); in migration_instance_init()
4081 qemu_sem_init(&ms->wait_unplug_sem, 0); in migration_instance_init()
4082 qemu_sem_init(&ms->postcopy_qemufile_src_sem, 0); in migration_instance_init()
4083 qemu_mutex_init(&ms->qemu_file_lock); in migration_instance_init()
4095 if (!migrate_params_check(&ms->parameters, errp)) { in migration_object_check()
4099 return migrate_caps_check(old_caps, ms->capabilities, errp); in migration_object_check()
4110 * TYPE_DEVICE's "-global" properties.