mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:17 +00:00
migration: Calculate expected downtime on demand
This value does not need to be calculated as frequent. Only calculate it on demand when query-migrate happened. With that we can remove the variable in MigrationState. This paves way for fixing this value to include all modules (not only RAM but others too). Reviewed-by: Juraj Marcin <jmarcin@redhat.com> Link: https://lore.kernel.org/r/20260421202110.306051-12-peterx@redhat.com Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
@@ -1041,6 +1041,17 @@ static bool migrate_show_downtime(MigrationState *s)
|
||||
return (s->state == MIGRATION_STATUS_COMPLETED) || migration_in_postcopy();
|
||||
}
|
||||
|
||||
/* Return expected downtime (unit: milliseconds) */
|
||||
int64_t migration_downtime_calc_expected(MigrationState *s)
|
||||
{
|
||||
if (mig_stats.dirty_sync_count <= 1) {
|
||||
return migrate_downtime_limit();
|
||||
}
|
||||
|
||||
return mig_stats.dirty_bytes_last_sync /
|
||||
migration_get_switchover_bw(s) * 1000;
|
||||
}
|
||||
|
||||
static void populate_time_info(MigrationInfo *info, MigrationState *s)
|
||||
{
|
||||
info->has_status = true;
|
||||
@@ -1061,7 +1072,7 @@ static void populate_time_info(MigrationInfo *info, MigrationState *s)
|
||||
info->downtime = s->downtime;
|
||||
} else {
|
||||
info->has_expected_downtime = true;
|
||||
info->expected_downtime = s->expected_downtime;
|
||||
info->expected_downtime = migration_downtime_calc_expected(s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1649,7 +1660,6 @@ int migrate_init(MigrationState *s, Error **errp)
|
||||
s->mbps = 0.0;
|
||||
s->pages_per_second = 0.0;
|
||||
s->downtime = 0;
|
||||
s->expected_downtime = 0;
|
||||
s->setup_time = 0;
|
||||
s->start_postcopy = false;
|
||||
s->migration_thread_running = false;
|
||||
@@ -3166,15 +3176,6 @@ static void migration_update_counters(MigrationState *s,
|
||||
s->pages_per_second = (double) transferred_pages /
|
||||
(((double) time_spent / 1000.0));
|
||||
|
||||
/*
|
||||
* if we haven't sent anything, we don't want to
|
||||
* recalculate. 10000 is a small enough number for our purposes
|
||||
*/
|
||||
if (mig_stats.dirty_pages_rate && transferred > 10000) {
|
||||
s->expected_downtime =
|
||||
mig_stats.dirty_bytes_last_sync / switchover_bw_per_ms;
|
||||
}
|
||||
|
||||
migration_rate_reset();
|
||||
|
||||
update_iteration_initial_status(s);
|
||||
@@ -3841,8 +3842,6 @@ void migration_start_outgoing(MigrationState *s)
|
||||
bool resume = (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP);
|
||||
int ret;
|
||||
|
||||
s->expected_downtime = migrate_downtime_limit();
|
||||
|
||||
if (resume) {
|
||||
/* This is a resumed migration */
|
||||
rate_limit = migrate_max_postcopy_bandwidth();
|
||||
|
||||
@@ -359,7 +359,6 @@ struct MigrationState {
|
||||
/* Timestamp when VM is down (ms) to migrate the last stuff */
|
||||
int64_t downtime_start;
|
||||
int64_t downtime;
|
||||
int64_t expected_downtime;
|
||||
bool capabilities[MIGRATION_CAPABILITY__MAX];
|
||||
int64_t setup_time;
|
||||
|
||||
@@ -585,6 +584,7 @@ void migration_cancel(void);
|
||||
void migration_populate_vfio_info(MigrationInfo *info);
|
||||
void migration_reset_vfio_bytes_transferred(void);
|
||||
void postcopy_temp_page_reset(PostcopyTmpPage *tmp_page);
|
||||
int64_t migration_downtime_calc_expected(MigrationState *s);
|
||||
|
||||
/*
|
||||
* Migration thread waiting for return path thread. Return non-zero if an
|
||||
|
||||
Reference in New Issue
Block a user