diff options
author | Peter Xu <peterx@redhat.com> | 2018-01-03 20:20:09 +0800 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2018-01-15 12:48:08 +0100 |
commit | 7287cbd46e2d6fb582ca78c3cb49b1e53d91a761 (patch) | |
tree | 94a880aa965440eb333fc5234563d98fa05cd4e6 /migration | |
parent | 4af246a34e3155365e6be9dda201f3467d0498d9 (diff) | |
download | qemu-7287cbd46e2d6fb582ca78c3cb49b1e53d91a761.zip qemu-7287cbd46e2d6fb582ca78c3cb49b1e53d91a761.tar.gz qemu-7287cbd46e2d6fb582ca78c3cb49b1e53d91a761.tar.bz2 |
migration: move vm_old_running into global state
Firstly, it was passed around. Let's just move it into MigrationState
just like many other variables as state of migration, renaming it to
vm_was_running.
One thing to mention is that for postcopy, we actually don't need this
knowledge at all since postcopy can't resume a VM even if it fails (we
can see that from the old code too: when we try to resume we also check
against "entered_postcopy" variable). So further we do this:
- in postcopy_start(), we don't update vm_old_running since useless
- in migration_thread(), we don't need to check entered_postcopy when
resume, since it's only used for precopy.
Comment this out too for that variable definition.
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Diffstat (limited to 'migration')
-rw-r--r-- | migration/migration.c | 17 | ||||
-rw-r--r-- | migration/migration.h | 6 |
2 files changed, 13 insertions, 10 deletions
diff --git a/migration/migration.c b/migration/migration.c index 23f6e50..e26f80d 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1302,6 +1302,7 @@ MigrationState *migrate_init(void) s->start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); s->total_time = 0; + s->vm_was_running = false; return s; } @@ -1885,7 +1886,7 @@ static int await_return_path_close_on_source(MigrationState *ms) * Switch from normal iteration to postcopy * Returns non-0 on error */ -static int postcopy_start(MigrationState *ms, bool *old_vm_running) +static int postcopy_start(MigrationState *ms) { int ret; QIOChannelBuffer *bioc; @@ -1903,7 +1904,6 @@ static int postcopy_start(MigrationState *ms, bool *old_vm_running) trace_postcopy_start_set_run(); qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); - *old_vm_running = runstate_is_running(); global_state_store(); ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); if (ret < 0) { @@ -2094,11 +2094,9 @@ static int migration_maybe_pause(MigrationState *s, * * @s: Current migration state * @current_active_state: The migration state we expect to be in - * @*old_vm_running: Pointer to old_vm_running flag * @*start_time: Pointer to time to update */ static void migration_completion(MigrationState *s, int current_active_state, - bool *old_vm_running, int64_t *start_time) { int ret; @@ -2107,7 +2105,7 @@ static void migration_completion(MigrationState *s, int current_active_state, qemu_mutex_lock_iothread(); *start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); - *old_vm_running = runstate_is_running(); + s->vm_was_running = runstate_is_running(); ret = global_state_store(); if (!ret) { @@ -2213,7 +2211,6 @@ static void *migration_thread(void *opaque) int64_t threshold_size = 0; int64_t start_time = initial_time; int64_t end_time; - bool old_vm_running = false; bool entered_postcopy = false; /* The active state we expect to be in; ACTIVE or POSTCOPY_ACTIVE */ enum MigrationStatus current_active_state = MIGRATION_STATUS_ACTIVE; @@ -2272,7 +2269,7 @@ static void *migration_thread(void *opaque) pend_nonpost <= threshold_size && atomic_read(&s->start_postcopy)) { - if (!postcopy_start(s, &old_vm_running)) { + if (!postcopy_start(s)) { current_active_state = MIGRATION_STATUS_POSTCOPY_ACTIVE; entered_postcopy = true; } @@ -2284,7 +2281,7 @@ static void *migration_thread(void *opaque) } else { trace_migration_thread_low_pending(pending_size); migration_completion(s, current_active_state, - &old_vm_running, &start_time); + &start_time); break; } } @@ -2357,9 +2354,9 @@ static void *migration_thread(void *opaque) * Fixme: we will run VM in COLO no matter its old running state. * After exited COLO, we will keep running. */ - old_vm_running = true; + s->vm_was_running = true; } - if (old_vm_running && !entered_postcopy) { + if (s->vm_was_running) { vm_start(); } else { if (runstate_check(RUN_STATE_FINISH_MIGRATE)) { diff --git a/migration/migration.h b/migration/migration.h index d1132b1..4cae263 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -123,6 +123,12 @@ struct MigrationState int64_t expected_downtime; bool enabled_capabilities[MIGRATION_CAPABILITY__MAX]; int64_t setup_time; + /* + * Whether guest was running when we enter the completion stage. + * If migration is interrupted by any reason, we need to continue + * running the guest on source. + */ + bool vm_was_running; /* Flag set once the migration has been asked to enter postcopy */ bool start_postcopy; |