migration: put the finish part into a new function
This patch only moved the last part of migration_thread() into a new function migration_iteration_finish() to make it much shorter. With previous works to remove some local variables, now it's fairly easy to do that. Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
2ad873057e
commit
199aa6d4e4
@ -2293,6 +2293,54 @@ static MigIterateState migration_iteration_run(MigrationState *s)
|
|||||||
return MIG_ITERATE_RESUME;
|
return MIG_ITERATE_RESUME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void migration_iteration_finish(MigrationState *s)
|
||||||
|
{
|
||||||
|
/* If we enabled cpu throttling for auto-converge, turn it off. */
|
||||||
|
cpu_throttle_stop();
|
||||||
|
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
|
switch (s->state) {
|
||||||
|
case MIGRATION_STATUS_COMPLETED:
|
||||||
|
migration_calculate_complete(s);
|
||||||
|
runstate_set(RUN_STATE_POSTMIGRATE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MIGRATION_STATUS_ACTIVE:
|
||||||
|
/*
|
||||||
|
* We should really assert here, but since it's during
|
||||||
|
* migration, let's try to reduce the usage of assertions.
|
||||||
|
*/
|
||||||
|
if (!migrate_colo_enabled()) {
|
||||||
|
error_report("%s: critical error: calling COLO code without "
|
||||||
|
"COLO enabled", __func__);
|
||||||
|
}
|
||||||
|
migrate_start_colo_process(s);
|
||||||
|
/*
|
||||||
|
* Fixme: we will run VM in COLO no matter its old running state.
|
||||||
|
* After exited COLO, we will keep running.
|
||||||
|
*/
|
||||||
|
s->vm_was_running = true;
|
||||||
|
/* Fallthrough */
|
||||||
|
case MIGRATION_STATUS_FAILED:
|
||||||
|
case MIGRATION_STATUS_CANCELLED:
|
||||||
|
if (s->vm_was_running) {
|
||||||
|
vm_start();
|
||||||
|
} else {
|
||||||
|
if (runstate_check(RUN_STATE_FINISH_MIGRATE)) {
|
||||||
|
runstate_set(RUN_STATE_POSTMIGRATE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Should not reach here, but if so, forgive the VM. */
|
||||||
|
error_report("%s: Unknown ending state %d", __func__, s->state);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
qemu_bh_schedule(s->cleanup_bh);
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Master migration thread on the source VM.
|
* Master migration thread on the source VM.
|
||||||
* It drives the migration and pumps the data down the outgoing channel.
|
* It drives the migration and pumps the data down the outgoing channel.
|
||||||
@ -2371,51 +2419,7 @@ static void *migration_thread(void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
trace_migration_thread_after_loop();
|
trace_migration_thread_after_loop();
|
||||||
/* If we enabled cpu throttling for auto-converge, turn it off. */
|
migration_iteration_finish(s);
|
||||||
cpu_throttle_stop();
|
|
||||||
|
|
||||||
qemu_mutex_lock_iothread();
|
|
||||||
switch (s->state) {
|
|
||||||
case MIGRATION_STATUS_COMPLETED:
|
|
||||||
migration_calculate_complete(s);
|
|
||||||
runstate_set(RUN_STATE_POSTMIGRATE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MIGRATION_STATUS_ACTIVE:
|
|
||||||
/*
|
|
||||||
* We should really assert here, but since it's during
|
|
||||||
* migration, let's try to reduce the usage of assertions.
|
|
||||||
*/
|
|
||||||
if (!migrate_colo_enabled()) {
|
|
||||||
error_report("%s: critical error: calling COLO code without "
|
|
||||||
"COLO enabled", __func__);
|
|
||||||
}
|
|
||||||
migrate_start_colo_process(s);
|
|
||||||
/*
|
|
||||||
* Fixme: we will run VM in COLO no matter its old running state.
|
|
||||||
* After exited COLO, we will keep running.
|
|
||||||
*/
|
|
||||||
s->vm_was_running = true;
|
|
||||||
/* Fallthrough */
|
|
||||||
case MIGRATION_STATUS_FAILED:
|
|
||||||
case MIGRATION_STATUS_CANCELLED:
|
|
||||||
if (s->vm_was_running) {
|
|
||||||
vm_start();
|
|
||||||
} else {
|
|
||||||
if (runstate_check(RUN_STATE_FINISH_MIGRATE)) {
|
|
||||||
runstate_set(RUN_STATE_POSTMIGRATE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* Should not reach here, but if so, forgive the VM. */
|
|
||||||
error_report("%s: Unknown ending state %d", __func__, s->state);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
qemu_bh_schedule(s->cleanup_bh);
|
|
||||||
qemu_mutex_unlock_iothread();
|
|
||||||
|
|
||||||
rcu_unregister_thread();
|
rcu_unregister_thread();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user