From: Fabiano Rosas Date: Fri, 23 Jan 2026 14:16:37 +0000 (-0300) Subject: migration: Free the error earlier in the resume case X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=318cb7906eb5bd10151cbfc5581e7bfbde5c5014;p=thirdparty%2Fqemu.git migration: Free the error earlier in the resume case Freeing the error at migration_connect() is redundant in the normal migration case. The freeing already happened at migrate_init(): qmp_migrate() -> migrate_prepare() -> migrate_init() -> qmp_migrate_finish() -> *_start_outgoing_migration() -> migration_channel_connect() -> migration_connect() For the resume case, migrate_prepare() returns early and doesn't reach migrate_init(). Move the extra migrate_error_free() call to migrate_prepare() along with the resume check. Also change migrate_init() to use migrate_error_free(), so it's easier to see where are the places the error gets freed. Reviewed-by: Peter Xu Reviewed-by: Prasad Pandit Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-8-farosas@suse.de Signed-off-by: Fabiano Rosas --- diff --git a/migration/migration.c b/migration/migration.c index d34c31298e..93013608ef 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1808,8 +1808,8 @@ int migrate_init(MigrationState *s, Error **errp) s->setup_time = 0; s->start_postcopy = false; s->migration_thread_running = false; - error_free(s->error); - s->error = NULL; + + migrate_error_free(s); if (should_send_vmdesc()) { s->vmdesc = json_writer_new(false); @@ -2084,6 +2084,13 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp) migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_PAUSED, MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP); + /* + * If there's a previous error, free it and prepare for + * another one. For the non-resume case, this happens at + * migrate_init() below. + */ + migrate_error_free(s); + /* This is a resume, skip init status */ return true; } @@ -4007,13 +4014,6 @@ void migration_connect(MigrationState *s, Error *error_in) bool resume = (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP); int ret; - /* - * If there's a previous error, free it and prepare for another one. - * Meanwhile if migration completes successfully, there won't have an error - * dumped when calling migration_cleanup(). - */ - migrate_error_free(s); - s->expected_downtime = migrate_downtime_limit(); if (error_in) { migration_connect_error_propagate(s, error_in);