Add a completion tracepoint that provides basic stats for debug. Displays throughput (MB/s and pages/s) and total time (ms).
Usage: $QEMU ... -trace migration_status Output: migration_status 1506 MB/s, 436725 pages/s, 8698 ms Signed-off-by: Fabiano Rosas <faro...@suse.de> --- migration/migration.c | 6 +++--- migration/migration.h | 4 +++- migration/savevm.c | 4 ++++ migration/trace-events | 1 + 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 29630523e2..17b26c1808 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -3811,7 +3811,7 @@ static uint64_t migration_total_bytes(MigrationState *s) ram_counters.multifd_bytes; } -static void migration_calculate_complete(MigrationState *s) +void migration_calculate_complete(MigrationState *s) { uint64_t bytes = migration_total_bytes(s); int64_t end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); @@ -3843,8 +3843,7 @@ static void update_iteration_initial_status(MigrationState *s) s->iteration_initial_pages = ram_get_total_transferred_pages(); } -static void migration_update_counters(MigrationState *s, - int64_t current_time) +void migration_update_counters(MigrationState *s, int64_t current_time) { uint64_t transferred, transferred_pages, time_spent; uint64_t current_bytes; /* bytes transferred since the beginning */ @@ -3941,6 +3940,7 @@ static void migration_iteration_finish(MigrationState *s) case MIGRATION_STATUS_COMPLETED: migration_calculate_complete(s); runstate_set(RUN_STATE_POSTMIGRATE); + trace_migration_status((int)s->mbps / 8, (int)s->pages_per_second, s->total_time); break; case MIGRATION_STATUS_COLO: if (!migrate_colo_enabled()) { diff --git a/migration/migration.h b/migration/migration.h index 84be34587f..01c8201cfa 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -387,7 +387,9 @@ struct MigrationState { }; void migrate_set_state(int *state, int old_state, int new_state); - +void migration_calculate_complete(MigrationState *s); +void migration_update_counters(MigrationState *s, + int64_t current_time); void migration_fd_process_incoming(QEMUFile *f, Error **errp); void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp); void migration_incoming_process(void); diff --git a/migration/savevm.c b/migration/savevm.c index 1f1bc19224..b369d11b19 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1638,6 +1638,7 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp) qemu_mutex_lock_iothread(); while (qemu_file_get_error(f) == 0) { + migration_update_counters(ms, qemu_clock_get_ms(QEMU_CLOCK_REALTIME)); if (qemu_savevm_state_iterate(f, false) > 0) { break; } @@ -1660,6 +1661,9 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp) } migrate_set_state(&ms->state, MIGRATION_STATUS_SETUP, status); + migration_calculate_complete(ms); + trace_migration_status((int)ms->mbps / 8, (int)ms->pages_per_second, ms->total_time); + /* f is outer parameter, it should not stay in global migration state after * this function finished */ ms->to_dst_file = NULL; diff --git a/migration/trace-events b/migration/trace-events index 92161eeac5..23e4dad1ec 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -165,6 +165,7 @@ migration_return_path_end_after(int rp_error) "%d" migration_thread_after_loop(void) "" migration_thread_file_err(void) "" migration_thread_setup_complete(void) "" +migration_status(int mpbs, int pages_per_second, int64_t total_time) "%d MB/s, %d pages/s, %ld ms" open_return_path_on_source(void) "" open_return_path_on_source_continue(void) "" postcopy_start(void) "" -- 2.35.3