From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Het Gala <het.gala@nutanix.com>
Cc: qemu-devel@nongnu.org, prerna.saxena@nutanix.com,
quintela@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com,
armbru@redhat.com, eblake@redhat.com, manish.mishra@nutanix.com,
aravind.retnakaran@nutanix.com
Subject: Re: [PATCH v8 8/9] migration: Implement MigrateChannelList to migration flow.
Date: Wed, 19 Jul 2023 11:33:01 +0100 [thread overview]
Message-ID: <ZLe73VZAoQ1Z9zSJ@redhat.com> (raw)
In-Reply-To: <20230713105713.236883-9-het.gala@nutanix.com>
On Thu, Jul 13, 2023 at 10:57:12AM +0000, Het Gala wrote:
> Integrate MigrateChannelList with all transport backends
> (socket, exec and rdma) for both src and dest migration
> endpoints.
>
> Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
> Signed-off-by: Het Gala <het.gala@nutanix.com>
> ---
> migration/migration.c | 77 ++++++++++++++++++++++++++++---------------
> migration/socket.c | 5 ++-
> 2 files changed, 54 insertions(+), 28 deletions(-)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 62894952ca..43c7e4b525 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -426,9 +426,10 @@ void migrate_add_address(SocketAddress *address)
> }
>
> static bool migrate_uri_parse(const char *uri,
> - MigrationAddress **channel,
> + MigrationChannel **channel,
> Error **errp)
> {
> + g_autoptr(MigrationChannel) val = g_new0(MigrationChannel, 1);
> g_autoptr(MigrationAddress) addr = g_new0(MigrationAddress, 1);
> SocketAddress *saddr = &addr->u.socket;
> InetSocketAddress *isock = &addr->u.rdma;
> @@ -464,7 +465,9 @@ static bool migrate_uri_parse(const char *uri,
> return false;
> }
>
> - *channel = addr;
> + val->channel_type = MIGRATION_CHANNEL_TYPE_MAIN;
> + val->addr = addr;
> + *channel = val;
> return true;
> }
>
> @@ -472,7 +475,8 @@ static void qemu_start_incoming_migration(const char *uri, bool has_channels,
> MigrationChannelList *channels,
> Error **errp)
> {
> - g_autoptr(MigrationAddress) channel = g_new0(MigrationAddress, 1);
> + g_autoptr(MigrationChannel) channel = g_new0(MigrationChannel, 1);
> + g_autoptr(MigrationAddress) addr = g_new0(MigrationAddress, 1);
>
> /*
> * Having preliminary checks for uri and channel
> @@ -482,20 +486,29 @@ static void qemu_start_incoming_migration(const char *uri, bool has_channels,
> "exclusive; exactly one of the two should be present in "
> "'migrate-incoming' qmp command ");
> return;
> - }
> -
> - if (uri && !migrate_uri_parse(uri, &channel, errp)) {
> - return;
> + } else if (channels) {
> + /* To verify that Migrate channel list has only item */
> + if (channels->next) {
> + error_setg(errp, "Channel list has more than one entries");
> + return;
> + }
> + channel = channels->value;
> + addr = channel->addr;
> + } else {
> + /* caller uses the old URI syntax */
> + if (uri && !migrate_uri_parse(uri, &channel, errp)) {
> + return;
> + }
> }
>
> /* transport mechanism not suitable for migration? */
> - if (!migration_channels_and_transport_compatible(channel, errp)) {
> + if (!migration_channels_and_transport_compatible(addr, errp)) {
This is strange - the API contract of migration_channels_and_transport_compatible
hasn't changed, so replacing MigrationChannel object with MigrationAddress is
surely not going to compile. Also the '} else {' branch above doesn't
set 'addr' so it will be NULL in that codepath
> return;
> }
>
> qapi_event_send_migration(MIGRATION_STATUS_SETUP);
> - if (channel->transport == MIGRATION_ADDRESS_TYPE_SOCKET) {
> - SocketAddress *saddr = &channel->u.socket;
> + if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) {
> + SocketAddress *saddr = &addr->u.socket;
> if (saddr->type == SOCKET_ADDRESS_TYPE_INET ||
> saddr->type == SOCKET_ADDRESS_TYPE_UNIX ||
> saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) {
> @@ -504,11 +517,11 @@ static void qemu_start_incoming_migration(const char *uri, bool has_channels,
> fd_start_incoming_migration(saddr->u.fd.str, errp);
> }
> #ifdef CONFIG_RDMA
> - } else if (channel->transport == MIGRATION_ADDRESS_TYPE_RDMA) {
> - rdma_start_incoming_migration(&channel->u.rdma, errp);
> -#endif
> - } else if (channel->transport == MIGRATION_ADDRESS_TYPE_EXEC) {
> - exec_start_incoming_migration(channel->u.exec.args, errp);
> + } else if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) {
> + rdma_start_incoming_migration(&addr->u.rdma, errp);
> + #endif
> + } else if (addr->transport == MIGRATION_ADDRESS_TYPE_EXEC) {
> + exec_start_incoming_migration(addr->u.exec.args, errp);
> } else {
> error_setg(errp, "unknown migration protocol: %s", uri);
> }
> @@ -1708,7 +1721,8 @@ void qmp_migrate(const char *uri, bool has_channels,
> bool resume_requested;
> Error *local_err = NULL;
> MigrationState *s = migrate_get_current();
> - g_autoptr(MigrationAddress) channel = g_new0(MigrationAddress, 1);
> + g_autoptr(MigrationChannel) channel = g_new0(MigrationChannel, 1);
> + g_autoptr(MigrationAddress) addr = g_new0(MigrationAddress, 1);
>
> /*
> * Having preliminary checks for uri and channel
> @@ -1718,14 +1732,23 @@ void qmp_migrate(const char *uri, bool has_channels,
> "exclusive; exactly one of the two should be present in "
> "'migrate' qmp command ");
> return;
> - }
> -
> - if (!migrate_uri_parse(uri, &channel, errp)) {
> - return;
> + } else if (channels) {
> + /* To verify that Migrate channel list has only item */
> + if (channels->next) {
> + error_setg(errp, "Channel list has more than one entries");
> + return;
> + }
> + channel = channels->value;
> + addr = channel->addr;
> + } else {
> + /* caller uses the old URI syntax */
> + if (uri && !migrate_uri_parse(uri, &channel, errp)) {
> + return;
> + }
> }
>
> /* transport mechanism not suitable for migration? */
> - if (!migration_channels_and_transport_compatible(channel, errp)) {
> + if (!migration_channels_and_transport_compatible(addr, errp)) {
> return;
> }
>
> @@ -1742,8 +1765,8 @@ void qmp_migrate(const char *uri, bool has_channels,
> }
> }
>
> - if (channel->transport == MIGRATION_ADDRESS_TYPE_SOCKET) {
> - SocketAddress *saddr = &channel->u.socket;
> + if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) {
> + SocketAddress *saddr = &addr->u.socket;
> if (saddr->type == SOCKET_ADDRESS_TYPE_INET ||
> saddr->type == SOCKET_ADDRESS_TYPE_UNIX ||
> saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) {
> @@ -1752,11 +1775,11 @@ void qmp_migrate(const char *uri, bool has_channels,
> fd_start_outgoing_migration(s, saddr->u.fd.str, &local_err);
> }
> #ifdef CONFIG_RDMA
> - } else if (channel->transport == MIGRATION_ADDRESS_TYPE_RDMA) {
> - rdma_start_outgoing_migration(s, &channel->u.rdma, &local_err);
> + } else if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) {
> + rdma_start_outgoing_migration(s, &addr->u.rdma, &local_err);
> #endif
> - } else if (channel->transport == MIGRATION_ADDRESS_TYPE_EXEC) {
> - exec_start_outgoing_migration(s, channel->u.exec.args, &local_err);
> + } else if (addr->transport == MIGRATION_ADDRESS_TYPE_EXEC) {
> + exec_start_outgoing_migration(s, addr->u.exec.args, &local_err);
> } else {
> if (!resume_requested) {
> yank_unregister_instance(MIGRATION_YANK_INSTANCE);
> diff --git a/migration/socket.c b/migration/socket.c
> index 8e7430b266..98e3ea1514 100644
> --- a/migration/socket.c
> +++ b/migration/socket.c
> @@ -28,6 +28,8 @@
> #include "trace.h"
> #include "postcopy-ram.h"
> #include "options.h"
> +#include "qapi/clone-visitor.h"
> +#include "qapi/qapi-visit-sockets.h"
>
> struct SocketOutgoingArgs {
> SocketAddress *saddr;
> @@ -114,12 +116,13 @@ void socket_start_outgoing_migration(MigrationState *s,
> {
> QIOChannelSocket *sioc = qio_channel_socket_new();
> struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);
> + SocketAddress *addr = QAPI_CLONE(SocketAddress, saddr);
>
> data->s = s;
>
> /* in case previous migration leaked it */
> qapi_free_SocketAddress(outgoing_args.saddr);
> - outgoing_args.saddr = saddr;
> + outgoing_args.saddr = addr;
>
> if (saddr->type == SOCKET_ADDRESS_TYPE_INET) {
> data->hostname = g_strdup(saddr->u.inet.host);
This patch isn't changing the API contract of socket_start_outgoing_migration,
so if this QAPI_CLONE is indeed required, that suggests it should have been
in an earlier patch which introduced the pre-requisite to clone.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2023-07-19 10:35 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-13 10:57 [PATCH v8 0/9] migration: Modify 'migrate' and 'migrate-incoming' QAPI commands for migration Het Gala
2023-07-13 10:57 ` [PATCH v8 1/9] migration: New QAPI type 'MigrateAddress' Het Gala
2023-07-19 9:51 ` Daniel P. Berrangé
2023-07-13 10:57 ` [PATCH v8 2/9] migration: convert migration 'uri' into 'MigrateAddress' Het Gala
2023-07-19 9:55 ` Daniel P. Berrangé
2023-07-13 10:57 ` [PATCH v8 3/9] migration: convert socket backend to accept MigrateAddress Het Gala
2023-07-19 9:59 ` Daniel P. Berrangé
2023-07-19 15:21 ` Daniel P. Berrangé
2023-07-13 10:57 ` [PATCH v8 4/9] migration: convert rdma " Het Gala
2023-07-19 10:01 ` Daniel P. Berrangé
2023-07-13 10:57 ` [PATCH v8 5/9] migration: convert exec " Het Gala
2023-07-19 10:02 ` Daniel P. Berrangé
2023-07-13 10:57 ` [PATCH v8 6/9] migration: New migrate and migrate-incoming argument 'channels' Het Gala
2023-07-19 10:11 ` Daniel P. Berrangé
2023-07-13 10:57 ` [PATCH v8 7/9] migration: modify migration_channels_and_uri_compatible() for new QAPI syntax Het Gala
2023-07-19 10:12 ` Daniel P. Berrangé
2023-07-13 10:57 ` [PATCH v8 8/9] migration: Implement MigrateChannelList to migration flow Het Gala
2023-07-19 10:33 ` Daniel P. Berrangé [this message]
2023-07-13 10:57 ` [PATCH v8 9/9] migration: Add test case for modified QAPI syntax Het Gala
2023-07-19 10:37 ` Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZLe73VZAoQ1Z9zSJ@redhat.com \
--to=berrange@redhat.com \
--cc=aravind.retnakaran@nutanix.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=het.gala@nutanix.com \
--cc=manish.mishra@nutanix.com \
--cc=pbonzini@redhat.com \
--cc=prerna.saxena@nutanix.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).