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 <peterx@redhat.com>
Reviewed-by: Prasad Pandit <pjp@fedoraproject.org>
Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-8-farosas@suse.de
Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
Fabiano Rosas
2026-01-23 11:16:37 -03:00
parent 5dafed3235
commit 318cb7906e

View File

@@ -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);