@@ -496,6 +496,8 @@ static void process_incoming_migration_bh(void *opaque)
} else if (migration_incoming_colo_enabled()) {
migration_incoming_disable_colo();
vm_start();
+ } else if (global_state_get_runstate() == RUN_STATE_SUSPENDED) {
+ vm_prepare_start(false, global_state_get_runstate());
} else {
runstate_set(global_state_get_runstate());
}
@@ -2109,7 +2111,6 @@ static int postcopy_start(MigrationState *ms, Error **errp)
qemu_mutex_lock_iothread();
trace_postcopy_start_set_run();
- qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL);
global_state_store();
ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
if (ret < 0) {
@@ -2315,7 +2316,6 @@ static void migration_completion(MigrationState *s)
if (s->state == MIGRATION_STATUS_ACTIVE) {
qemu_mutex_lock_iothread();
s->downtime_start = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
- qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL);
s->vm_old_state = runstate_get();
global_state_store();
@@ -2070,12 +2070,17 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
dirty_bitmap_mig_before_vm_start();
- if (autostart) {
- /* Hold onto your hats, starting the CPU */
- vm_start();
+ if (!global_state_received() ||
+ global_state_get_runstate() == RUN_STATE_RUNNING) {
+ if (autostart) {
+ vm_start();
+ } else {
+ runstate_set(RUN_STATE_PAUSED);
+ }
+ } else if (global_state_get_runstate() == RUN_STATE_SUSPENDED) {
+ vm_prepare_start(false, RUN_STATE_SUSPENDED);
} else {
- /* leave it paused and let management decide when to start the CPU */
- runstate_set(RUN_STATE_PAUSED);
+ runstate_set(global_state_get_runstate());
}
qemu_bh_delete(mis->bh);