Encapsulate the MigrationChannelList parsing in a new migrate_channels_parse() located at channel.c.
Signed-off-by: Fabiano Rosas <[email protected]> --- migration/channel.c | 54 +++++++++++++++++++++++++++++++++++++++++++ migration/channel.h | 5 ++++ migration/migration.c | 50 +++++++++++---------------------------- 3 files changed, 73 insertions(+), 36 deletions(-) diff --git a/migration/channel.c b/migration/channel.c index ba9aa1c58b..8b43c3d983 100644 --- a/migration/channel.c +++ b/migration/channel.c @@ -11,6 +11,7 @@ */ #include "qemu/osdep.h" +#include "qemu/cutils.h" #include "channel.h" #include "exec.h" #include "fd.h" @@ -20,7 +21,9 @@ #include "migration.h" #include "multifd.h" #include "options.h" +#include "qapi/clone-visitor.h" #include "qapi/qapi-types-migration.h" +#include "qapi/qapi-visit-migration.h" #include "qapi/error.h" #include "qemu-file.h" #include "qemu/yank.h" @@ -314,3 +317,54 @@ int migration_channel_read_peek(QIOChannel *ioc, return 0; } + +bool migrate_channels_parse(MigrationChannelList *channels, + MigrationChannel **main_channelp, + MigrationChannel **cpr_channelp, + Error **errp) +{ + MigrationChannel *channelv[MIGRATION_CHANNEL_TYPE__MAX] = { NULL }; + bool single_channel; + + if (cpr_channelp) { + single_channel = false; + } else { + single_channel = true; + } + + for ( ; channels; channels = channels->next) { + MigrationChannelType type; + + type = channels->value->channel_type; + if (channelv[type]) { + error_setg(errp, "Channel list has more than one %s entry", + MigrationChannelType_str(type)); + return false; + } + channelv[type] = channels->value; + + if (single_channel) { + if (channels->next) { + error_setg(errp, "Channel list must have only one entry, " + "for type 'main'"); + return false; + } + break; + } + } + + if (cpr_channelp) { + *cpr_channelp = QAPI_CLONE(MigrationChannel, + channelv[MIGRATION_CHANNEL_TYPE_CPR]); + } + + *main_channelp = QAPI_CLONE(MigrationChannel, + channelv[MIGRATION_CHANNEL_TYPE_MAIN]); + + if (!(*main_channelp)->addr) { + error_setg(errp, "Channel list has no main entry"); + return false; + } + + return true; +} diff --git a/migration/channel.h b/migration/channel.h index 86934fee38..b3276550b7 100644 --- a/migration/channel.h +++ b/migration/channel.h @@ -51,4 +51,9 @@ static inline bool migration_connect_incoming(MigrationAddress *addr, { return migration_connect(addr, false, errp); } + +bool migrate_channels_parse(MigrationChannelList *channels, + MigrationChannel **main_channelp, + MigrationChannel **cpr_channelp, + Error **errp); #endif diff --git a/migration/migration.c b/migration/migration.c index c11cd4ebf6..6064f1e5ea 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -741,8 +741,7 @@ static void qemu_setup_incoming_migration(const char *uri, bool has_channels, MigrationChannelList *channels, Error **errp) { - g_autoptr(MigrationChannel) channel = NULL; - MigrationAddress *addr = NULL; + g_autoptr(MigrationChannel) main_ch = NULL; MigrationIncomingState *mis = migration_incoming_get_current(); /* @@ -754,25 +753,20 @@ static void qemu_setup_incoming_migration(const char *uri, bool has_channels, } if (channels) { - /* To verify that Migrate channel list has only item */ - if (channels->next) { - error_setg(errp, "Channel list must have only one entry, " - "for type 'main'"); + if (!migrate_channels_parse(channels, &main_ch, NULL, errp)) { return; } - addr = channels->value->addr; } if (uri) { /* caller uses the old URI syntax */ - if (!migrate_uri_parse(uri, &channel, errp)) { + if (!migrate_uri_parse(uri, &main_ch, errp)) { return; } - addr = channel->addr; } /* transport mechanism not suitable for migration? */ - if (!migration_transport_compatible(addr, errp)) { + if (!migration_transport_compatible(main_ch->addr, errp)) { return; } @@ -784,7 +778,7 @@ static void qemu_setup_incoming_migration(const char *uri, bool has_channels, return; } - migration_connect_incoming(addr, errp); + migration_connect_incoming(main_ch->addr, errp); /* Close cpr socket to tell source that we are listening */ cpr_state_close(); @@ -2127,10 +2121,8 @@ void qmp_migrate(const char *uri, bool has_channels, MigrationChannelList *channels, bool has_detach, bool detach, bool has_resume, bool resume, Error **errp) { - g_autoptr(MigrationChannel) channel = NULL; - MigrationAddress *addr = NULL; - MigrationChannel *channelv[MIGRATION_CHANNEL_TYPE__MAX] = { NULL }; - MigrationChannel *cpr_channel = NULL; + g_autoptr(MigrationChannel) main_ch = NULL; + g_autoptr(MigrationChannel) cpr_ch = NULL; /* * Having preliminary checks for uri and channel @@ -2141,38 +2133,24 @@ void qmp_migrate(const char *uri, bool has_channels, } if (channels) { - for ( ; channels; channels = channels->next) { - MigrationChannelType type = channels->value->channel_type; - - if (channelv[type]) { - error_setg(errp, "Channel list has more than one %s entry", - MigrationChannelType_str(type)); - return; - } - channelv[type] = channels->value; - } - cpr_channel = channelv[MIGRATION_CHANNEL_TYPE_CPR]; - addr = channelv[MIGRATION_CHANNEL_TYPE_MAIN]->addr; - if (!addr) { - error_setg(errp, "Channel list has no main entry"); + if (!migrate_channels_parse(channels, &main_ch, &cpr_ch, errp)) { return; } } if (uri) { /* caller uses the old URI syntax */ - if (!migrate_uri_parse(uri, &channel, errp)) { + if (!migrate_uri_parse(uri, &main_ch, errp)) { return; } - addr = channel->addr; } /* transport mechanism not suitable for migration? */ - if (!migration_transport_compatible(addr, errp)) { + if (!migration_transport_compatible(main_ch->addr, errp)) { return; } - if (migrate_mode() == MIG_MODE_CPR_TRANSFER && !cpr_channel) { + if (migrate_mode() == MIG_MODE_CPR_TRANSFER && !cpr_ch) { error_setg(errp, "missing 'cpr' migration channel"); return; } @@ -2189,7 +2167,7 @@ void qmp_migrate(const char *uri, bool has_channels, */ Error *local_err = NULL; - if (!cpr_state_save(cpr_channel, &local_err)) { + if (!cpr_state_save(cpr_ch, &local_err)) { goto out; } @@ -2205,10 +2183,10 @@ void qmp_migrate(const char *uri, bool has_channels, */ if (migrate_mode() == MIG_MODE_CPR_TRANSFER) { migrate_hup_add(cpr_state_ioc(), (GSourceFunc)qmp_migrate_finish_cb, - QAPI_CLONE(MigrationAddress, addr)); + QAPI_CLONE(MigrationAddress, main_ch->addr)); } else { - qmp_migrate_finish(addr, &local_err); + qmp_migrate_finish(main_ch->addr, &local_err); } out: -- 2.51.0
