@@ -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()) {
@@ -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);
@@ -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;
@@ -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) ""
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 <farosas@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(-)