diff options
-rw-r--r-- | include/migration/migration.h | 2 | ||||
-rw-r--r-- | migration/migration.c | 36 |
2 files changed, 23 insertions, 15 deletions
diff --git a/include/migration/migration.h b/include/migration/migration.h index d9494b895e..a64ca7c399 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -169,6 +169,8 @@ struct MigrationState RAMBlock *last_req_rb; }; +void migrate_set_state(int *state, int old_state, int new_state); + void process_incoming_migration(QEMUFile *f); void qemu_start_incoming_migration(const char *uri, Error **errp); diff --git a/migration/migration.c b/migration/migration.c index c842499575..5db6227546 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -787,9 +787,9 @@ void qmp_migrate_start_postcopy(Error **errp) /* shared migration helpers */ -static void migrate_set_state(MigrationState *s, int old_state, int new_state) +void migrate_set_state(int *state, int old_state, int new_state) { - if (atomic_cmpxchg(&s->state, old_state, new_state) == old_state) { + if (atomic_cmpxchg(state, old_state, new_state) == old_state) { trace_migrate_set_state(new_state); migrate_generate_event(new_state); } @@ -822,7 +822,7 @@ static void migrate_fd_cleanup(void *opaque) (s->state != MIGRATION_STATUS_POSTCOPY_ACTIVE)); if (s->state == MIGRATION_STATUS_CANCELLING) { - migrate_set_state(s, MIGRATION_STATUS_CANCELLING, + migrate_set_state(&s->state, MIGRATION_STATUS_CANCELLING, MIGRATION_STATUS_CANCELLED); } @@ -833,7 +833,8 @@ void migrate_fd_error(MigrationState *s) { trace_migrate_fd_error(); assert(s->file == NULL); - migrate_set_state(s, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_FAILED); + migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, + MIGRATION_STATUS_FAILED); notifier_list_notify(&migration_state_notifiers, s); } @@ -853,7 +854,7 @@ static void migrate_fd_cancel(MigrationState *s) if (!migration_is_setup_or_active(old_state)) { break; } - migrate_set_state(s, old_state, MIGRATION_STATUS_CANCELLING); + migrate_set_state(&s->state, old_state, MIGRATION_STATUS_CANCELLING); } while (s->state != MIGRATION_STATUS_CANCELLING); /* @@ -927,7 +928,7 @@ MigrationState *migrate_init(const MigrationParams *params) s->migration_thread_running = false; s->last_req_rb = NULL; - migrate_set_state(s, MIGRATION_STATUS_NONE, MIGRATION_STATUS_SETUP); + migrate_set_state(&s->state, MIGRATION_STATUS_NONE, MIGRATION_STATUS_SETUP); QSIMPLEQ_INIT(&s->src_page_requests); @@ -1026,7 +1027,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, } else { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol"); - migrate_set_state(s, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_FAILED); + migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, + MIGRATION_STATUS_FAILED); return; } @@ -1405,7 +1407,7 @@ static int postcopy_start(MigrationState *ms, bool *old_vm_running) int ret; const QEMUSizedBuffer *qsb; int64_t time_at_stop = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); - migrate_set_state(ms, MIGRATION_STATUS_ACTIVE, + migrate_set_state(&ms->state, MIGRATION_STATUS_ACTIVE, MIGRATION_STATUS_POSTCOPY_ACTIVE); trace_postcopy_start(); @@ -1496,7 +1498,7 @@ static int postcopy_start(MigrationState *ms, bool *old_vm_running) ret = qemu_file_get_error(ms->file); if (ret) { error_report("postcopy_start: Migration stream errored"); - migrate_set_state(ms, MIGRATION_STATUS_POSTCOPY_ACTIVE, + migrate_set_state(&ms->state, MIGRATION_STATUS_POSTCOPY_ACTIVE, MIGRATION_STATUS_FAILED); } @@ -1505,7 +1507,7 @@ static int postcopy_start(MigrationState *ms, bool *old_vm_running) fail_closefb: qemu_fclose(fb); fail: - migrate_set_state(ms, MIGRATION_STATUS_POSTCOPY_ACTIVE, + migrate_set_state(&ms->state, MIGRATION_STATUS_POSTCOPY_ACTIVE, MIGRATION_STATUS_FAILED); qemu_mutex_unlock_iothread(); return -1; @@ -1574,11 +1576,13 @@ static void migration_completion(MigrationState *s, int current_active_state, goto fail; } - migrate_set_state(s, current_active_state, MIGRATION_STATUS_COMPLETED); + migrate_set_state(&s->state, current_active_state, + MIGRATION_STATUS_COMPLETED); return; fail: - migrate_set_state(s, current_active_state, MIGRATION_STATUS_FAILED); + migrate_set_state(&s->state, current_active_state, + MIGRATION_STATUS_FAILED); } /* @@ -1623,7 +1627,8 @@ static void *migration_thread(void *opaque) s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; current_active_state = MIGRATION_STATUS_ACTIVE; - migrate_set_state(s, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_ACTIVE); + migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, + MIGRATION_STATUS_ACTIVE); trace_migration_thread_setup_complete(); @@ -1666,7 +1671,8 @@ static void *migration_thread(void *opaque) } if (qemu_file_get_error(s->file)) { - migrate_set_state(s, current_active_state, MIGRATION_STATUS_FAILED); + migrate_set_state(&s->state, current_active_state, + MIGRATION_STATUS_FAILED); trace_migration_thread_file_err(); break; } @@ -1747,7 +1753,7 @@ void migrate_fd_connect(MigrationState *s) if (migrate_postcopy_ram()) { if (open_return_path_on_source(s)) { error_report("Unable to open return-path for postcopy"); - migrate_set_state(s, MIGRATION_STATUS_SETUP, + migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_FAILED); migrate_fd_cleanup(s); return; |