From: Fabiano Rosas Date: Fri, 23 Jan 2026 14:16:45 +0000 (-0300) Subject: migration: Start incoming from channel.c X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9834b6de6156860bc47ac890cb34b6c895e7f8a1;p=thirdparty%2Fqemu.git migration: Start incoming from channel.c Leave migration_ioc_process_incoming to do only the channel identification process and move the migration start into channel.c. Both routines will be renamed in the next patches to better reflect their usage. Reviewed-by: Peter Xu Reviewed-by: Prasad Pandit Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-16-farosas@suse.de Signed-off-by: Fabiano Rosas --- diff --git a/migration/channel.c b/migration/channel.c index 6acce7b2a2..b8d757c17b 100644 --- a/migration/channel.c +++ b/migration/channel.c @@ -33,6 +33,7 @@ void migration_channel_process_incoming(QIOChannel *ioc) { MigrationIncomingState *mis = migration_incoming_get_current(); Error *local_err = NULL; + MigChannelType ch; trace_migration_set_incoming_channel( ioc, object_get_typename(OBJECT(ioc))); @@ -41,9 +42,16 @@ void migration_channel_process_incoming(QIOChannel *ioc) migration_tls_channel_process_incoming(ioc, &local_err); } else { migration_ioc_register_yank(ioc); - migration_ioc_process_incoming(ioc, &local_err); - } + ch = migration_ioc_process_incoming(ioc, &local_err); + if (!ch) { + goto out; + } + if (migration_incoming_setup(ioc, ch, &local_err)) { + migration_incoming_process(); + } + } +out: if (local_err) { error_report_err(local_err); migrate_set_state(&mis->state, mis->state, MIGRATION_STATUS_FAILED); diff --git a/migration/channel.h b/migration/channel.h index 93dedbf52b..b361e1c838 100644 --- a/migration/channel.h +++ b/migration/channel.h @@ -19,11 +19,12 @@ #include "io/channel.h" /* Migration channel types */ -enum { +typedef enum { + CH_NONE, CH_MAIN, CH_MULTIFD, CH_POSTCOPY -}; +} MigChannelType; void migration_channel_process_incoming(QIOChannel *ioc); diff --git a/migration/migration.c b/migration/migration.c index 93ebed5f8e..8a27d93498 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1037,10 +1037,10 @@ static bool migration_has_main_and_multifd_channels(void) return true; } -void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp) +MigChannelType migration_ioc_process_incoming(QIOChannel *ioc, Error **errp) { MigrationIncomingState *mis = migration_incoming_get_current(); - uint8_t channel; + MigChannelType channel = CH_NONE; uint32_t channel_magic = 0; int ret = 0; @@ -1059,7 +1059,7 @@ void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp) ret = migration_channel_read_peek(ioc, (void *)&channel_magic, sizeof(channel_magic), errp); if (ret != 0) { - return; + goto out; } channel_magic = be32_to_cpu(channel_magic); @@ -1074,7 +1074,6 @@ void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp) channel = CH_MAIN; } else { error_setg(errp, "unknown channel magic: %u", channel_magic); - return; } } else if (mis->from_src_file && migrate_multifd()) { /* @@ -1086,16 +1085,14 @@ void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp) channel = CH_MAIN; } else { error_setg(errp, "non-peekable channel used without multifd"); - return; } } else { assert(migrate_postcopy_preempt()); channel = CH_POSTCOPY; } - if (migration_incoming_setup(ioc, channel, errp)) { - migration_incoming_process(); - } +out: + return channel; } /** diff --git a/migration/migration.h b/migration/migration.h index cd6cfd62ba..b55cc40613 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -28,6 +28,7 @@ #include "postcopy-ram.h" #include "system/runstate.h" #include "migration/misc.h" +#include "channel.h" #define MIGRATION_THREAD_SNAPSHOT "mig/snapshot" #define MIGRATION_THREAD_DIRTY_RATE "mig/dirtyrate" @@ -527,7 +528,7 @@ struct MigrationState { void migrate_set_state(MigrationStatus *state, MigrationStatus old_state, MigrationStatus new_state); -void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp); +MigChannelType migration_ioc_process_incoming(QIOChannel *ioc, Error **errp); void migration_incoming_process(void); bool migration_incoming_setup(QIOChannel *ioc, uint8_t channel, Error **errp); void migration_outgoing_setup(QIOChannel *ioc);