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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user