* [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration
@ 2023-02-09 10:27 Het Gala
2023-02-09 10:27 ` [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
` (5 more replies)
0 siblings, 6 replies; 11+ messages in thread
From: Het Gala @ 2023-02-09 10:27 UTC (permalink / raw)
To: qemu-devel
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, Het Gala
This is v3 patchset for modified 'migrate' QAPI design for migration
connection.
Links to previous versions:
v1: https://lists.gnu.org/archive/html/qemu-devel/2022-12/msg04339.html
v2: https://lists.gnu.org/archive/html/qemu-devel/2023-02/msg02106.html
Thanks to Eric for his quick and valuable suggestions.
v2->v3 changelog:
- minor improvements regarding 'migrate' QAPI design in qapi/migration.json
file.
- 'socket-type': 'SocketAddress' --> 'data': 'SocketAddress' for keeping
consistency accross all the transport backends.
Abstract:
---------
Current QAPI 'migrate' command design (for initiating a migration
stream) contains information regarding different migrate transport mechanism
(tcp / unix / exec), dest-host IP address, and binding port number in form of
a string. Thus the design does seem to have some design issues. Some of the
issues, stated below are:
1. Use of string URIs is a data encoding scheme within a data encoding scheme.
QEMU code should directly be able to work with the results from QAPI,
without resorting to do a second level of parsing (eg. socket_parse()).
2. For features / parameters related to migration, the migration tunables needs
to be defined and updated upfront. For example, 'migrate-set-capability'
and 'migrate-set-parameter' is required to enable multifd capability and
multifd-number of channels respectively. Instead, 'Multifd-channels' can
directly be represented as a single additional parameter to 'migrate'
QAPI. 'migrate-set-capability' and 'migrate-set-parameter' commands could
be used for runtime tunables that need setting after migration has already
started.
The current patchset focuses on solving the first problem of multi-level
encoding of URIs. The patch defines 'migrate' command as a QAPI discriminated
union for the various transport backends (like socket, exec and rdma), and on
basis of transport backends, different migration parameters are defined.
(uri) string --> (channel) Channel-type
Transport-type
Migration parameters based on transport type
-----------------------------------------------------------------------------
Het Gala (6):
migration: moved hmp_split_at_commma() helper func to qapi-util.c file
migration: Updated QAPI format for 'migrate' qemu monitor command
migration: HMP side changes for modified 'migrate' QAPI design
migration: Avoid multiple parsing of uri in migration code flow
migration: Modified 'migrate-incoming' QAPI and HMP side changes on
the destination interface.
migration: Established connection for listener sockets on the dest
interface
include/monitor/hmp.h | 1 -
include/qapi/util.h | 1 +
migration/exec.c | 38 ++++++--
migration/exec.h | 6 +-
migration/migration-hmp-cmds.c | 113 +++++++++++++++++++++++-
migration/migration.c | 144 +++++++++++++++++++++++--------
migration/rdma.c | 39 +++------
migration/rdma.h | 5 +-
migration/socket.c | 37 ++------
migration/socket.h | 5 +-
monitor/hmp-cmds.c | 19 ----
net/net-hmp-cmds.c | 2 +-
qapi/migration.json | 153 +++++++++++++++++++++++++++++++--
qapi/qapi-util.c | 19 ++++
softmmu/vl.c | 2 +-
stats/stats-hmp-cmds.c | 2 +-
16 files changed, 456 insertions(+), 130 deletions(-)
--
2.22.3
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file
2023-02-09 10:27 [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
@ 2023-02-09 10:27 ` Het Gala
2023-02-09 11:56 ` Juan Quintela
` (2 more replies)
2023-02-09 10:27 ` [PATCH v3 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command Het Gala
` (4 subsequent siblings)
5 siblings, 3 replies; 11+ messages in thread
From: Het Gala @ 2023-02-09 10:27 UTC (permalink / raw)
To: qemu-devel
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, Het Gala
renamed hmp_split_at_comma() --> str_split_at_comma()
Shifted helper function to qapi-util.c file. Give external linkage, as
this function will be handy in coming commit for migration.
Minor correction:
g_strsplit(str ?: "", ",", -1) --> g_strsplit(str ? str : "", ",", -1)
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
Signed-off-by: Het Gala <het.gala@nutanix.com>
---
include/monitor/hmp.h | 1 -
include/qapi/util.h | 1 +
monitor/hmp-cmds.c | 19 -------------------
net/net-hmp-cmds.c | 2 +-
qapi/qapi-util.c | 19 +++++++++++++++++++
stats/stats-hmp-cmds.c | 2 +-
6 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
index 2220f14fc9..e80848fbd0 100644
--- a/include/monitor/hmp.h
+++ b/include/monitor/hmp.h
@@ -19,7 +19,6 @@
bool hmp_handle_error(Monitor *mon, Error *err);
void hmp_help_cmd(Monitor *mon, const char *name);
-strList *hmp_split_at_comma(const char *str);
void hmp_info_name(Monitor *mon, const QDict *qdict);
void hmp_info_version(Monitor *mon, const QDict *qdict);
diff --git a/include/qapi/util.h b/include/qapi/util.h
index 81a2b13a33..6c8d8575e3 100644
--- a/include/qapi/util.h
+++ b/include/qapi/util.h
@@ -29,6 +29,7 @@ bool qapi_bool_parse(const char *name, const char *value, bool *obj,
Error **errp);
int parse_qapi_name(const char *name, bool complete);
+struct strList *str_split_at_comma(const char *str);
/*
* For any GenericList @list, insert @element at the front.
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index 34bd8c67d7..9665e6e0a5 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -39,25 +39,6 @@ bool hmp_handle_error(Monitor *mon, Error *err)
return false;
}
-/*
- * Split @str at comma.
- * A null @str defaults to "".
- */
-strList *hmp_split_at_comma(const char *str)
-{
- char **split = g_strsplit(str ?: "", ",", -1);
- strList *res = NULL;
- strList **tail = &res;
- int i;
-
- for (i = 0; split[i]; i++) {
- QAPI_LIST_APPEND(tail, split[i]);
- }
-
- g_free(split);
- return res;
-}
-
void hmp_info_name(Monitor *mon, const QDict *qdict)
{
NameInfo *info;
diff --git a/net/net-hmp-cmds.c b/net/net-hmp-cmds.c
index 41d326bf5f..a3c597a727 100644
--- a/net/net-hmp-cmds.c
+++ b/net/net-hmp-cmds.c
@@ -72,7 +72,7 @@ void hmp_announce_self(Monitor *mon, const QDict *qdict)
migrate_announce_params());
qapi_free_strList(params->interfaces);
- params->interfaces = hmp_split_at_comma(interfaces_str);
+ params->interfaces = str_split_at_comma(interfaces_str);
params->has_interfaces = params->interfaces != NULL;
params->id = g_strdup(id);
qmp_announce_self(params, NULL);
diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
index 63596e11c5..e26b9d957b 100644
--- a/qapi/qapi-util.c
+++ b/qapi/qapi-util.c
@@ -152,3 +152,22 @@ int parse_qapi_name(const char *str, bool complete)
}
return p - str;
}
+
+/*
+ * Split @str at comma.
+ * A null @str defaults to "".
+ */
+strList *str_split_at_comma(const char *str)
+{
+ char **split = g_strsplit(str ? str : "", ",", -1);
+ strList *res = NULL;
+ strList **tail = &res;
+ int i;
+
+ for (i = 0; split[i]; i++) {
+ QAPI_LIST_APPEND(tail, split[i]);
+ }
+
+ g_free(split);
+ return res;
+}
diff --git a/stats/stats-hmp-cmds.c b/stats/stats-hmp-cmds.c
index 531e35d128..cfee05a076 100644
--- a/stats/stats-hmp-cmds.c
+++ b/stats/stats-hmp-cmds.c
@@ -174,7 +174,7 @@ static StatsFilter *stats_filter(StatsTarget target, const char *names,
request->provider = provider_idx;
if (names && !g_str_equal(names, "*")) {
request->has_names = true;
- request->names = hmp_split_at_comma(names);
+ request->names = str_split_at_comma(names);
}
QAPI_LIST_PREPEND(request_list, request);
}
--
2.22.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command
2023-02-09 10:27 [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
2023-02-09 10:27 ` [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
@ 2023-02-09 10:27 ` Het Gala
2023-02-10 9:07 ` Markus Armbruster
2023-02-09 10:27 ` [PATCH v3 3/6] migration: HMP side changes for modified 'migrate' QAPI design Het Gala
` (3 subsequent siblings)
5 siblings, 1 reply; 11+ messages in thread
From: Het Gala @ 2023-02-09 10:27 UTC (permalink / raw)
To: qemu-devel
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, Het Gala
Existing 'migrate' QAPI design enforces transport mechanism, ip address
of destination interface and corresponding port number in the form
of a unified string 'uri' parameter for initiating a migration stream.
This scheme has a significant flaw in it - double encoding of existing
URIs to extract migration info.
The current patch maps QAPI uri design onto well defined MigrateChannel
struct. This modified QAPI helps in preventing multi-level uri
encodings ('uri' parameter is kept for backward compatibility).
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
Signed-off-by: Het Gala <het.gala@nutanix.com>
---
qapi/migration.json | 129 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 127 insertions(+), 2 deletions(-)
diff --git a/qapi/migration.json b/qapi/migration.json
index c84fa10e86..261a6770e7 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -1449,12 +1449,106 @@
##
{ 'command': 'migrate-continue', 'data': {'state': 'MigrationStatus'} }
+##
+# @MigrateTransport:
+#
+# The supported communication transport mechanisms for migration
+#
+# @socket: Supported communication type between two devices for migration.
+# Socket is able to cover all of 'tcp', 'unix', 'vsock' and
+# 'fd' already
+#
+# @exec: Supported communication type to redirect migration stream into file.
+#
+# @rdma: Supported communication type to redirect rdma type migration stream.
+#
+# Since 8.0
+##
+{ 'enum': 'MigrateTransport',
+ 'data': ['socket', 'exec', 'rdma'] }
+
+##
+# @MigrateSocketAddr:
+#
+# To support different type of socket.
+#
+# Since 8.0
+##
+{ 'struct': 'MigrateSocketAddr',
+ 'data': {'data': 'SocketAddress' } }
+
+##
+# @MigrateExecAddr:
+ #
+ # Since 8.0
+ ##
+{ 'struct': 'MigrateExecAddr',
+ 'data': {'data': [ 'str' ] } }
+
+##
+# @MigrateRdmaAddr:
+#
+# Since 8.0
+##
+{ 'struct': 'MigrateRdmaAddr',
+ 'data': {'data': 'InetSocketAddress' } }
+
+##
+# @MigrateAddress:
+#
+# The options available for communication transport mechanisms for migration
+#
+# Since 8.0
+##
+{ 'union': 'MigrateAddress',
+ 'base': { 'transport' : 'MigrateTransport'},
+ 'discriminator': 'transport',
+ 'data': {
+ 'socket': 'MigrateSocketAddr',
+ 'exec': 'MigrateExecAddr',
+ 'rdma': 'MigrateRdmaAddr' } }
+
+##
+# @MigrateChannelType:
+#
+# The supported options for migration channel type requests
+#
+# @main: Support request for main outbound migration control channel
+#
+# Since 8.0
+##
+{ 'enum': 'MigrateChannelType',
+ 'data': [ 'main' ] }
+
+##
+# @MigrateChannel:
+#
+# Information regarding migration Channel-type for transferring packets,
+# source and corresponding destination interface for socket connection
+# and number of multifd channels over the interface.
+#
+# @channeltype: Name of Channel type for transfering packet information
+#
+# @addr: Information regarding migration parameters of destination interface
+#
+# Since 8.0
+##
+{ 'struct': 'MigrateChannel',
+ 'data': {
+ 'channeltype': 'MigrateChannelType',
+ 'addr': 'MigrateAddress' } }
+
##
# @migrate:
#
# Migrates the current running guest to another Virtual Machine.
#
# @uri: the Uniform Resource Identifier of the destination VM
+# for migration thread
+#
+# @channel: Struct containing migration channel type, along with all
+# the details of destination interface required for initiating
+# a migration stream.
#
# @blk: do block migration (full disk copy)
#
@@ -1479,15 +1573,46 @@
# 3. The user Monitor's "detach" argument is invalid in QMP and should not
# be used
#
+# 4. The uri argument should have the Uniform Resource Identifier of default
+# destination VM. This connection will be bound to default network
+#
+# 5. The 'uri' and 'channel' arguments are mutually exclusive; exactly one
+# of the two should be present.
+#
# Example:
#
# -> { "execute": "migrate", "arguments": { "uri": "tcp:0:4446" } }
# <- { "return": {} }
#
+# -> { "execute": "migrate",
+# "arguments": {
+# "channel": { "channeltype": "main",
+# "addr": { "transport": "socket",
+# "data": { "type": "inet",
+# "host": "10.12.34.9",
+# "port": "1050" } } } } }
+# <- { "return": {} }
+#
+# -> { "execute": "migrate",
+# "arguments": {
+# "channel": { "channeltype": "main",
+# "addr": { "transport": "exec",
+# "data": [ "/bin/nc", "-U",
+# "/some/sock" ] } } } }
+# <- { "return": {} }
+#
+# -> { "execute": "migrate",
+# "arguments": {
+# "channel": { "channeltype": "main",
+# "addr": { "transport": "rdma",
+# "data": { "host": "10.12.34.9",
+# "port": "1050" } } } } }
+# <- { "return": {} }
+#
##
{ 'command': 'migrate',
- 'data': {'uri': 'str', '*blk': 'bool', '*inc': 'bool',
- '*detach': 'bool', '*resume': 'bool' } }
+ 'data': {'*uri': 'str', '*channel': 'MigrateChannel', '*blk': 'bool',
+ '*inc': 'bool', '*detach': 'bool', '*resume': 'bool' } }
##
# @migrate-incoming:
--
2.22.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 3/6] migration: HMP side changes for modified 'migrate' QAPI design
2023-02-09 10:27 [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
2023-02-09 10:27 ` [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
2023-02-09 10:27 ` [PATCH v3 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command Het Gala
@ 2023-02-09 10:27 ` Het Gala
2023-02-09 10:27 ` [PATCH v3 4/6] migration: Avoid multiple parsing of uri in migration code flow Het Gala
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Het Gala @ 2023-02-09 10:27 UTC (permalink / raw)
To: qemu-devel
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, Het Gala
hmp_migrate() stores modified QAPI 'migrate' arguments from qdict
into well defined MigrateChannel struct with help of
migrate_channel_from_qdict().
hmp_migrate() also accepts uri string as modified QAPI a 'migrate'
argument (for backward compatibility).
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
Signed-off-by: Het Gala <het.gala@nutanix.com>
---
migration/migration-hmp-cmds.c | 105 ++++++++++++++++++++++++++++++++-
migration/migration.c | 15 ++++-
2 files changed, 116 insertions(+), 4 deletions(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index ef25bc8929..1005a9e1ca 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -32,6 +32,101 @@
#include "sysemu/runstate.h"
#include "ui/qemu-spice.h"
+static bool
+migrate_channel_from_qdict(MigrateChannel **channel,
+ const QDict *qdict, Error **errp)
+{
+ Error *err = NULL;
+ const char *channeltype = qdict_get_try_str(qdict, "channeltype");
+ const char *transport_str = qdict_get_try_str(qdict, "transport");
+ const char *socketaddr_type = qdict_get_try_str(qdict, "type");
+ const char *inet_host = qdict_get_try_str(qdict, "host");
+ const char *inet_port = qdict_get_try_str(qdict, "port");
+ const char *unix_path = qdict_get_try_str(qdict, "path");
+ const char *vsock_cid = qdict_get_try_str(qdict, "cid");
+ const char *vsock_port = qdict_get_try_str(qdict, "port");
+ const char *fd = qdict_get_try_str(qdict, "str");
+ QList *exec = qdict_get_qlist(qdict, "exec");
+ MigrateChannel *val = g_new0(MigrateChannel, 1);
+ MigrateChannelType channel_type;
+ MigrateTransport transport;
+ MigrateAddress *addr = g_new0(MigrateAddress, 1);
+ SocketAddress *saddr = g_new(SocketAddress, 1);
+ SocketAddressType type;
+ InetSocketAddress *isock = g_new0(InetSocketAddress, 1);
+
+ channel_type = qapi_enum_parse(&MigrateChannelType_lookup,
+ channeltype, -1, &err);
+ if (channel_type < 0) {
+ goto end;
+ }
+
+ transport = qapi_enum_parse(&MigrateTransport_lookup,
+ transport_str, -1, &err);
+ if (transport < 0) {
+ goto end;
+ }
+
+ type = qapi_enum_parse(&SocketAddressType_lookup,
+ socketaddr_type, -1, &err);
+ if (type < 0) {
+ goto end;
+ }
+
+ addr->transport = transport;
+
+ switch (transport) {
+ case MIGRATE_TRANSPORT_SOCKET:
+ saddr->type = type;
+
+ switch (type) {
+ case SOCKET_ADDRESS_TYPE_INET:
+ saddr->u.inet.host = (char *)inet_host;
+ saddr->u.inet.port = (char *)inet_port;
+ break;
+ case SOCKET_ADDRESS_TYPE_UNIX:
+ saddr->u.q_unix.path = (char *)unix_path;
+ break;
+ case SOCKET_ADDRESS_TYPE_VSOCK:
+ saddr->u.vsock.cid = (char *)vsock_cid;
+ saddr->u.vsock.port = (char *)vsock_port;
+ break;
+ case SOCKET_ADDRESS_TYPE_FD:
+ saddr->u.fd.str = (char *)fd;
+ break;
+ default:
+ error_setg(errp, "%s: Unknown socket type %d",
+ __func__, saddr->type);
+ break;
+ }
+
+ addr->u.socket.data = saddr;
+ break;
+ case MIGRATE_TRANSPORT_EXEC:
+ addr->u.exec.data = (strList *)exec;
+ break;
+ case MIGRATE_TRANSPORT_RDMA:
+ isock->host = (char *)inet_host;
+ isock->port = (char *)inet_port;
+ addr->u.rdma.data = isock;
+ break;
+ default:
+ error_setg(errp, "%s: Unknown migrate transport type %d",
+ __func__, addr->transport);
+ break;
+ }
+
+ val->channeltype = channel_type;
+ val->addr = addr;
+ *channel = val;
+ return true;
+
+end:
+ error_propagate(errp, err);
+ return false;
+}
+
+
void hmp_info_migrate(Monitor *mon, const QDict *qdict)
{
MigrationInfo *info;
@@ -701,8 +796,16 @@ void hmp_migrate(Monitor *mon, const QDict *qdict)
const char *uri = qdict_get_str(qdict, "uri");
Error *err = NULL;
- qmp_migrate(uri, !!blk, blk, !!inc, inc,
+ MigrateChannel *channel = g_new0(MigrateChannel, 1);
+
+ if (!migrate_channel_from_qdict(&channel, qdict, &err)) {
+ error_setg(&err, "error in retrieving channel from qdict");
+ return;
+ }
+
+ qmp_migrate(uri, channel, !!blk, blk, !!inc, inc,
false, false, true, resume, &err);
+ qapi_free_MigrateChannel(channel);
if (hmp_handle_error(mon, err)) {
return;
}
diff --git a/migration/migration.c b/migration/migration.c
index 7a14aa98d8..f6dd8dbb03 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2463,9 +2463,9 @@ static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
return true;
}
-void qmp_migrate(const char *uri, bool has_blk, bool blk,
- bool has_inc, bool inc, bool has_detach, bool detach,
- bool has_resume, bool resume, Error **errp)
+void qmp_migrate(const char *uri, MigrateChannel *channel, bool has_blk,
+ bool blk, bool has_inc, bool inc, bool has_detach,
+ bool detach, bool has_resume, bool resume, Error **errp)
{
Error *local_err = NULL;
MigrationState *s = migrate_get_current();
@@ -2483,6 +2483,15 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
}
}
+ /*
+ * Having preliminary checks for uri and channel
+ */
+ if (uri && channel) {
+ error_setg(errp, "uri and channels options should be"
+ "mutually exclusive");
+ return;
+ }
+
migrate_protocol_allow_multi_channels(false);
if (strstart(uri, "tcp:", &p) ||
strstart(uri, "unix:", NULL) ||
--
2.22.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 4/6] migration: Avoid multiple parsing of uri in migration code flow
2023-02-09 10:27 [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
` (2 preceding siblings ...)
2023-02-09 10:27 ` [PATCH v3 3/6] migration: HMP side changes for modified 'migrate' QAPI design Het Gala
@ 2023-02-09 10:27 ` Het Gala
2023-02-09 10:27 ` [PATCH v3 5/6] migration: Modified 'migrate-incoming' QAPI and HMP side changes on the destination interface Het Gala
2023-02-09 10:27 ` [PATCH v3 6/6] migration: Established connection for listener sockets on the dest interface Het Gala
5 siblings, 0 replies; 11+ messages in thread
From: Het Gala @ 2023-02-09 10:27 UTC (permalink / raw)
To: qemu-devel
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, Het Gala
In existing senario, 'migrate' QAPI argument - string uri, is encoded
twice to extract migration parameters for stream connection. This is
not a good representation of migration wire protocol as it is a data
encoding scheme within a data encoding scheme. Qemu should be able to
directly work with results from QAPI without having to do a second
level parsing.
Modified 'migrate' QAPI design supports well defined MigrateChannel
struct which plays important role in avoiding double encoding
of uri strings.
qemu_uri_parsing() parses uri string (kept for backward
compatibility) and populate the MigrateChannel struct parameters.
Migration code flow for all required migration transport types -
socket, exec and rdma is modified.
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
Signed-off-by: Het Gala <het.gala@nutanix.com>
---
migration/exec.c | 31 ++++++++++++++++--
migration/exec.h | 4 ++-
migration/migration.c | 75 +++++++++++++++++++++++++++++++++++--------
migration/rdma.c | 30 +++++------------
migration/rdma.h | 3 +-
migration/socket.c | 21 ++++--------
migration/socket.h | 3 +-
7 files changed, 110 insertions(+), 57 deletions(-)
diff --git a/migration/exec.c b/migration/exec.c
index 375d2e1b54..4fa9819792 100644
--- a/migration/exec.c
+++ b/migration/exec.c
@@ -23,14 +23,39 @@
#include "migration.h"
#include "io/channel-command.h"
#include "trace.h"
+#include "qapi/error.h"
-void exec_start_outgoing_migration(MigrationState *s, const char *command, Error **errp)
+void init_exec_array(strList *command, const char *argv[], Error **errp)
+{
+ int i = 0;
+ strList *lst;
+
+ for (lst = command; lst ; lst = lst->next) {
+ argv[i++] = lst->value;
+ }
+
+ /*
+ * Considering exec command always has 3 arguments to execute
+ * a command directly from the bash itself.
+ */
+ if (i > 3) {
+ error_setg(errp, "exec accepts maximum of 3 arguments in the list");
+ return;
+ }
+
+ argv[i] = NULL;
+ return;
+}
+
+void exec_start_outgoing_migration(MigrationState *s, strList *command,
+ Error **errp)
{
QIOChannel *ioc;
- const char *argv[] = { "/bin/sh", "-c", command, NULL };
+ const char *argv[4];
+ init_exec_array(command, argv, errp);
- trace_migration_exec_outgoing(command);
+ trace_migration_exec_outgoing(argv[2]);
ioc = QIO_CHANNEL(qio_channel_command_new_spawn(argv,
O_RDWR,
errp));
diff --git a/migration/exec.h b/migration/exec.h
index b210ffde7a..5b39ba6cbb 100644
--- a/migration/exec.h
+++ b/migration/exec.h
@@ -19,8 +19,10 @@
#ifndef QEMU_MIGRATION_EXEC_H
#define QEMU_MIGRATION_EXEC_H
+void init_exec_array(strList *command, const char *argv[], Error **errp);
+
void exec_start_incoming_migration(const char *host_port, Error **errp);
-void exec_start_outgoing_migration(MigrationState *s, const char *host_port,
+void exec_start_outgoing_migration(MigrationState *s, strList *host_port,
Error **errp);
#endif
diff --git a/migration/migration.c b/migration/migration.c
index f6dd8dbb03..91f00795d4 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -63,6 +63,7 @@
#include "sysemu/cpus.h"
#include "yank_functions.h"
#include "sysemu/qtest.h"
+#include "qemu/sockets.h"
#include "ui/qemu-spice.h"
#define MAX_THROTTLE (128 << 20) /* Migration transfer speed throttling */
@@ -489,6 +490,44 @@ void migrate_add_address(SocketAddress *address)
QAPI_CLONE(SocketAddress, address));
}
+static bool migrate_uri_parse(const char *uri,
+ MigrateChannel **channel,
+ Error **errp)
+{
+ Error *local_err = NULL;
+ MigrateChannel *val = g_new0(MigrateChannel, 1);
+ MigrateAddress *addrs = g_new0(MigrateAddress, 1);
+ SocketAddress *saddr = g_new0(SocketAddress, 1);
+ InetSocketAddress *isock = g_new0(InetSocketAddress, 1);
+
+ if (strstart(uri, "exec:", NULL)) {
+ addrs->transport = MIGRATE_TRANSPORT_EXEC;
+ addrs->u.exec.data = str_split_at_comma(uri + strlen("exec:"));
+ } else if (strstart(uri, "rdma:", NULL) &&
+ !inet_parse(isock, uri + strlen("rdma:"), errp)) {
+ addrs->transport = MIGRATE_TRANSPORT_RDMA;
+ addrs->u.rdma.data = isock;
+ } else if (strstart(uri, "tcp:", NULL) ||
+ strstart(uri, "unix:", NULL) ||
+ strstart(uri, "vsock:", NULL) ||
+ strstart(uri, "fd:", NULL)) {
+ addrs->transport = MIGRATE_TRANSPORT_SOCKET;
+ saddr = socket_parse(uri, &local_err);
+ addrs->u.socket.data = saddr;
+ }
+
+ val->channeltype = MIGRATE_CHANNEL_TYPE_MAIN;
+ val->addr = addrs;
+ *channel = val;
+
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return false;
+ }
+
+ return true;
+}
+
static void qemu_start_incoming_migration(const char *uri, Error **errp)
{
const char *p = NULL;
@@ -2469,7 +2508,8 @@ void qmp_migrate(const char *uri, MigrateChannel *channel, bool has_blk,
{
Error *local_err = NULL;
MigrationState *s = migrate_get_current();
- const char *p = NULL;
+ MigrateAddress *addrs = g_new0(MigrateAddress, 1);
+ SocketAddress *saddr = g_new0(SocketAddress, 1);
if (!migrate_prepare(s, has_blk && blk, has_inc && inc,
has_resume && resume, errp)) {
@@ -2490,22 +2530,29 @@ void qmp_migrate(const char *uri, MigrateChannel *channel, bool has_blk,
error_setg(errp, "uri and channels options should be"
"mutually exclusive");
return;
+ } else if (uri && !migrate_uri_parse(uri, &channel, &local_err)) {
+ error_setg(errp, "Error parsing uri");
+ return;
}
migrate_protocol_allow_multi_channels(false);
- if (strstart(uri, "tcp:", &p) ||
- strstart(uri, "unix:", NULL) ||
- strstart(uri, "vsock:", NULL)) {
- migrate_protocol_allow_multi_channels(true);
- socket_start_outgoing_migration(s, p ? p : uri, &local_err);
-#ifdef CONFIG_RDMA
- } else if (strstart(uri, "rdma:", &p)) {
- rdma_start_outgoing_migration(s, p, &local_err);
-#endif
- } else if (strstart(uri, "exec:", &p)) {
- exec_start_outgoing_migration(s, p, &local_err);
- } else if (strstart(uri, "fd:", &p)) {
- fd_start_outgoing_migration(s, p, &local_err);
+ addrs = channel->addr;
+ saddr = channel->addr->u.socket.data;
+ if (addrs->transport == MIGRATE_TRANSPORT_SOCKET) {
+ if (saddr->type == SOCKET_ADDRESS_TYPE_INET ||
+ saddr->type == SOCKET_ADDRESS_TYPE_UNIX ||
+ saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) {
+ migrate_protocol_allow_multi_channels(true);
+ socket_start_outgoing_migration(s, saddr, &local_err);
+ } else if (saddr->type == SOCKET_ADDRESS_TYPE_FD) {
+ fd_start_outgoing_migration(s, saddr->u.fd.str, &local_err);
+ }
+ #ifdef CONFIG_RDMA
+ } else if (addrs->transport == MIGRATE_TRANSPORT_RDMA) {
+ rdma_start_outgoing_migration(s, addrs->u.rdma.data, &local_err);
+ #endif
+ } else if (addrs->transport == MIGRATE_TRANSPORT_EXEC) {
+ exec_start_outgoing_migration(s, addrs->u.exec.data, &local_err);
} else {
if (!(has_resume && resume)) {
yank_unregister_instance(MIGRATION_YANK_INSTANCE);
diff --git a/migration/rdma.c b/migration/rdma.c
index 288eadc2d2..48f49add6f 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -316,7 +316,6 @@ typedef struct RDMALocalBlocks {
typedef struct RDMAContext {
char *host;
int port;
- char *host_port;
RDMAWorkRequestData wr_data[RDMA_WRID_MAX];
@@ -2449,9 +2448,7 @@ static void qemu_rdma_cleanup(RDMAContext *rdma)
rdma->channel = NULL;
}
g_free(rdma->host);
- g_free(rdma->host_port);
rdma->host = NULL;
- rdma->host_port = NULL;
}
@@ -2733,28 +2730,17 @@ static void qemu_rdma_return_path_dest_init(RDMAContext *rdma_return_path,
rdma_return_path->is_return_path = true;
}
-static void *qemu_rdma_data_init(const char *host_port, Error **errp)
+static void *qemu_rdma_data_init(InetSocketAddress *saddr, Error **errp)
{
RDMAContext *rdma = NULL;
- InetSocketAddress *addr;
- if (host_port) {
+ if (saddr) {
rdma = g_new0(RDMAContext, 1);
rdma->current_index = -1;
rdma->current_chunk = -1;
- addr = g_new(InetSocketAddress, 1);
- if (!inet_parse(addr, host_port, NULL)) {
- rdma->port = atoi(addr->port);
- rdma->host = g_strdup(addr->host);
- rdma->host_port = g_strdup(host_port);
- } else {
- ERROR(errp, "bad RDMA migration address '%s'", host_port);
- g_free(rdma);
- rdma = NULL;
- }
-
- qapi_free_InetSocketAddress(addr);
+ rdma->host = g_strdup(saddr->host);
+ rdma->port = atoi(saddr->port);
}
return rdma;
@@ -3354,6 +3340,7 @@ static int qemu_rdma_accept(RDMAContext *rdma)
.private_data_len = sizeof(cap),
};
RDMAContext *rdma_return_path = NULL;
+ InetSocketAddress *isock = g_new0(InetSocketAddress, 1);
struct rdma_cm_event *cm_event;
struct ibv_context *verbs;
int ret = -EINVAL;
@@ -4152,14 +4139,13 @@ err:
error_propagate(errp, local_err);
if (rdma) {
g_free(rdma->host);
- g_free(rdma->host_port);
}
g_free(rdma);
g_free(rdma_return_path);
}
void rdma_start_outgoing_migration(void *opaque,
- const char *host_port, Error **errp)
+ InetSocketAddress *addr, Error **errp)
{
MigrationState *s = opaque;
RDMAContext *rdma_return_path = NULL;
@@ -4172,7 +4158,7 @@ void rdma_start_outgoing_migration(void *opaque,
return;
}
- rdma = qemu_rdma_data_init(host_port, errp);
+ rdma = qemu_rdma_data_init(addr, errp);
if (rdma == NULL) {
goto err;
}
@@ -4193,7 +4179,7 @@ void rdma_start_outgoing_migration(void *opaque,
/* RDMA postcopy need a separate queue pair for return path */
if (migrate_postcopy()) {
- rdma_return_path = qemu_rdma_data_init(host_port, errp);
+ rdma_return_path = qemu_rdma_data_init(addr, errp);
if (rdma_return_path == NULL) {
goto return_path_err;
diff --git a/migration/rdma.h b/migration/rdma.h
index de2ba09dc5..8d9978e1a9 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -13,11 +13,12 @@
* later. See the COPYING file in the top-level directory.
*
*/
+#include "io/channel-socket.h"
#ifndef QEMU_MIGRATION_RDMA_H
#define QEMU_MIGRATION_RDMA_H
-void rdma_start_outgoing_migration(void *opaque, const char *host_port,
+void rdma_start_outgoing_migration(void *opaque, InetSocketAddress *addr,
Error **errp);
void rdma_start_incoming_migration(const char *host_port, Error **errp);
diff --git a/migration/socket.c b/migration/socket.c
index e6fdf3c5e1..c751e0bfc1 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -27,6 +27,8 @@
#include "io/net-listener.h"
#include "trace.h"
#include "postcopy-ram.h"
+#include "qapi/clone-visitor.h"
+#include "qapi/qapi-visit-sockets.h"
struct SocketOutgoingArgs {
SocketAddress *saddr;
@@ -107,19 +109,20 @@ out:
object_unref(OBJECT(sioc));
}
-static void
-socket_start_outgoing_migration_internal(MigrationState *s,
+void socket_start_outgoing_migration(MigrationState *s,
SocketAddress *saddr,
Error **errp)
{
QIOChannelSocket *sioc = qio_channel_socket_new();
struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);
+ SocketAddress *addr = g_new0(SocketAddress, 1);
+ 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);
@@ -134,18 +137,6 @@ socket_start_outgoing_migration_internal(MigrationState *s,
NULL);
}
-void socket_start_outgoing_migration(MigrationState *s,
- const char *str,
- Error **errp)
-{
- Error *err = NULL;
- SocketAddress *saddr = socket_parse(str, &err);
- if (!err) {
- socket_start_outgoing_migration_internal(s, saddr, &err);
- }
- error_propagate(errp, err);
-}
-
static void socket_accept_incoming_migration(QIONetListener *listener,
QIOChannelSocket *cioc,
gpointer opaque)
diff --git a/migration/socket.h b/migration/socket.h
index dc54df4e6c..95c9c166ec 100644
--- a/migration/socket.h
+++ b/migration/socket.h
@@ -19,6 +19,7 @@
#include "io/channel.h"
#include "io/task.h"
+#include "io/channel-socket.h"
void socket_send_channel_create(QIOTaskFunc f, void *data);
QIOChannel *socket_send_channel_create_sync(Error **errp);
@@ -26,6 +27,6 @@ int socket_send_channel_destroy(QIOChannel *send);
void socket_start_incoming_migration(const char *str, Error **errp);
-void socket_start_outgoing_migration(MigrationState *s, const char *str,
+void socket_start_outgoing_migration(MigrationState *s, SocketAddress *saddr,
Error **errp);
#endif
--
2.22.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 5/6] migration: Modified 'migrate-incoming' QAPI and HMP side changes on the destination interface.
2023-02-09 10:27 [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
` (3 preceding siblings ...)
2023-02-09 10:27 ` [PATCH v3 4/6] migration: Avoid multiple parsing of uri in migration code flow Het Gala
@ 2023-02-09 10:27 ` Het Gala
2023-02-09 10:27 ` [PATCH v3 6/6] migration: Established connection for listener sockets on the dest interface Het Gala
5 siblings, 0 replies; 11+ messages in thread
From: Het Gala @ 2023-02-09 10:27 UTC (permalink / raw)
To: qemu-devel
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, Het Gala
'migrate-incoming' QAPI design have been modified into well-defined
MigrateChannel struct to prevent multiple encoding of uri strings on
the destination side.'uri' parameter is kept for backward compatibility.
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
Signed-off-by: Het Gala <het.gala@nutanix.com>
---
migration/migration-hmp-cmds.c | 8 +++++++-
migration/migration.c | 3 ++-
qapi/migration.json | 24 +++++++++++++++++++++---
softmmu/vl.c | 2 +-
4 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index 1005a9e1ca..1ab3375e9e 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -500,8 +500,14 @@ void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
Error *err = NULL;
const char *uri = qdict_get_str(qdict, "uri");
- qmp_migrate_incoming(uri, &err);
+ MigrateChannel *channel = g_new0(MigrateChannel, 1);
+ if (!migrate_channel_from_qdict(&channel, qdict, &err)) {
+ error_setg(&err, "error in retrieving channel from qdict");
+ return;
+ }
+ qmp_migrate_incoming(uri, channel, &err);
+ qapi_free_MigrateChannel(channel);
hmp_handle_error(mon, err);
}
diff --git a/migration/migration.c b/migration/migration.c
index 91f00795d4..5fbf252243 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2314,7 +2314,8 @@ void migrate_del_blocker(Error *reason)
migration_blockers = g_slist_remove(migration_blockers, reason);
}
-void qmp_migrate_incoming(const char *uri, Error **errp)
+void qmp_migrate_incoming(const char *uri, MigrateChannel *channel,
+ Error **errp)
{
Error *local_err = NULL;
static bool once = true;
diff --git a/qapi/migration.json b/qapi/migration.json
index 261a6770e7..d43265965c 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -1621,11 +1621,15 @@
# with -incoming defer
#
# @uri: The Uniform Resource Identifier identifying the source or
-# address to listen on
+# the address to listen on
+#
+# @channel: Struct containing migration channel type, along with
+# all the details of the destination interface required
+# for the address to listen on for migration stream.
#
# Returns: nothing on success
#
-# Since: 2.3
+# Since: 8.0
#
# Notes:
#
@@ -1638,14 +1642,28 @@
#
# 3. The uri format is the same as for -incoming
#
+# 4. The 'uri' and 'channel' arguments are mutually exclusive; exactly one
+# of the two should be present.
+#
# Example:
#
# -> { "execute": "migrate-incoming",
# "arguments": { "uri": "tcp::4446" } }
# <- { "return": {} }
#
+# -> { "execute": "migrate-incoming",
+# "arguments": {
+# "channel": { "channeltype": "main",
+# "addr": { "transport": "socket",
+# "data": { "type": "inet",
+# "host": "10.12.34.9",
+# "port": "1050" } } } } }
+# <- { "return": {} }
+#
##
-{ 'command': 'migrate-incoming', 'data': {'uri': 'str' } }
+{ 'command': 'migrate-incoming',
+ 'data': {'*uri': 'str',
+ '*channel': 'MigrateChannel'} }
##
# @xen-save-devices-state:
diff --git a/softmmu/vl.c b/softmmu/vl.c
index b2ee3fee3f..579ed59023 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2614,7 +2614,7 @@ void qmp_x_exit_preconfig(Error **errp)
if (incoming) {
Error *local_err = NULL;
if (strcmp(incoming, "defer") != 0) {
- qmp_migrate_incoming(incoming, &local_err);
+ qmp_migrate_incoming(incoming, NULL, &local_err);
if (local_err) {
error_reportf_err(local_err, "-incoming %s: ", incoming);
exit(1);
--
2.22.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 6/6] migration: Established connection for listener sockets on the dest interface
2023-02-09 10:27 [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
` (4 preceding siblings ...)
2023-02-09 10:27 ` [PATCH v3 5/6] migration: Modified 'migrate-incoming' QAPI and HMP side changes on the destination interface Het Gala
@ 2023-02-09 10:27 ` Het Gala
5 siblings, 0 replies; 11+ messages in thread
From: Het Gala @ 2023-02-09 10:27 UTC (permalink / raw)
To: qemu-devel
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, Het Gala
Modified 'migrate-incoming' QAPI design supports MigrateChannel parameters.
This well-defined struct replaces uri string to prevent multiple encodings.
(uri paramter is kept for backward compatibility).
socket_start_incoming_migration() has been deprecated and
socket_start_incoming_migration_internal() name has been replaced with
socket_outgoing_migration().
qemu_uri_parsing() has been used to populate the migration parameters in
MigrateChannel struct.
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
Signed-off-by: Het Gala <het.gala@nutanix.com>
---
migration/exec.c | 7 +++---
migration/exec.h | 2 +-
migration/migration.c | 51 +++++++++++++++++++++++++++++--------------
migration/rdma.c | 9 +++++---
migration/rdma.h | 2 +-
migration/socket.c | 16 ++------------
migration/socket.h | 2 +-
7 files changed, 50 insertions(+), 39 deletions(-)
diff --git a/migration/exec.c b/migration/exec.c
index 4fa9819792..8506ad7f18 100644
--- a/migration/exec.c
+++ b/migration/exec.c
@@ -77,12 +77,13 @@ static gboolean exec_accept_incoming_migration(QIOChannel *ioc,
return G_SOURCE_REMOVE;
}
-void exec_start_incoming_migration(const char *command, Error **errp)
+void exec_start_incoming_migration(strList *command, Error **errp)
{
QIOChannel *ioc;
- const char *argv[] = { "/bin/sh", "-c", command, NULL };
+ const char *argv[4];
+ init_exec_array(command, argv, errp);
- trace_migration_exec_incoming(command);
+ trace_migration_exec_incoming(argv[2]);
ioc = QIO_CHANNEL(qio_channel_command_new_spawn(argv,
O_RDWR,
errp));
diff --git a/migration/exec.h b/migration/exec.h
index 5b39ba6cbb..5335f7c24a 100644
--- a/migration/exec.h
+++ b/migration/exec.h
@@ -21,7 +21,7 @@
#define QEMU_MIGRATION_EXEC_H
void init_exec_array(strList *command, const char *argv[], Error **errp);
-void exec_start_incoming_migration(const char *host_port, Error **errp);
+void exec_start_incoming_migration(strList *host_port, Error **errp);
void exec_start_outgoing_migration(MigrationState *s, strList *host_port,
Error **errp);
diff --git a/migration/migration.c b/migration/migration.c
index 5fbf252243..35d5e1e72d 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -528,27 +528,46 @@ static bool migrate_uri_parse(const char *uri,
return true;
}
-static void qemu_start_incoming_migration(const char *uri, Error **errp)
+static void qemu_start_incoming_migration(const char *uri,
+ MigrateChannel *channel,
+ Error **errp)
{
- const char *p = NULL;
+ MigrateAddress *addrs = g_new0(MigrateAddress, 1);
+ SocketAddress *saddr = g_new0(SocketAddress, 1);
+
+ /*
+ * Having preliminary checks for uri and channel
+ */
+ if (uri && channel) {
+ error_setg(errp, "uri and channels options should be used "
+ "mutually exclusive");
+ return;
+ } else if (uri && !migrate_uri_parse(uri, &channel, errp)) {
+ error_setg(errp, "Error parsing uri");
+ return;
+ }
migrate_protocol_allow_multi_channels(false); /* reset it anyway */
+ addrs = channel->addr;
+ saddr = channel->addr->u.socket.data;
qapi_event_send_migration(MIGRATION_STATUS_SETUP);
- if (strstart(uri, "tcp:", &p) ||
- strstart(uri, "unix:", NULL) ||
- strstart(uri, "vsock:", NULL)) {
- migrate_protocol_allow_multi_channels(true);
- socket_start_incoming_migration(p ? p : uri, errp);
+ if (addrs->transport == MIGRATE_TRANSPORT_SOCKET) {
+ if (saddr->type == SOCKET_ADDRESS_TYPE_INET ||
+ saddr->type == SOCKET_ADDRESS_TYPE_UNIX ||
+ saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) {
+ migrate_protocol_allow_multi_channels(true);
+ socket_start_incoming_migration(saddr, errp);
+ } else if (saddr->type == SOCKET_ADDRESS_TYPE_FD) {
+ fd_start_incoming_migration(saddr->u.fd.str, errp);
+ }
#ifdef CONFIG_RDMA
- } else if (strstart(uri, "rdma:", &p)) {
- rdma_start_incoming_migration(p, errp);
+ } else if (addrs->transport == MIGRATE_TRANSPORT_RDMA) {
+ rdma_start_incoming_migration(addrs->u.rdma.data, errp);
#endif
- } else if (strstart(uri, "exec:", &p)) {
- exec_start_incoming_migration(p, errp);
- } else if (strstart(uri, "fd:", &p)) {
- fd_start_incoming_migration(p, errp);
+ } else if (addrs->transport == MIGRATE_TRANSPORT_EXEC) {
+ exec_start_incoming_migration(addrs->u.exec.data, errp);
} else {
- error_setg(errp, "unknown migration protocol: %s", uri);
+ error_setg(errp, "unknown migration protocol: %i", addrs->transport);
}
}
@@ -2333,7 +2352,7 @@ void qmp_migrate_incoming(const char *uri, MigrateChannel *channel,
return;
}
- qemu_start_incoming_migration(uri, &local_err);
+ qemu_start_incoming_migration(uri, channel, &local_err);
if (local_err) {
yank_unregister_instance(MIGRATION_YANK_INSTANCE);
@@ -2369,7 +2388,7 @@ void qmp_migrate_recover(const char *uri, Error **errp)
* only re-setup the migration stream and poke existing migration
* to continue using that newly established channel.
*/
- qemu_start_incoming_migration(uri, errp);
+ qemu_start_incoming_migration(uri, NULL, errp);
}
void qmp_migrate_pause(Error **errp)
diff --git a/migration/rdma.c b/migration/rdma.c
index 48f49add6f..0225bbaf3c 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3356,12 +3356,15 @@ static int qemu_rdma_accept(RDMAContext *rdma)
goto err_rdma_dest_wait;
}
+ isock->host = rdma->host;
+ isock->port = (char *)(intptr_t)rdma->port;
+
/*
* initialize the RDMAContext for return path for postcopy after first
* connection request reached.
*/
if (migrate_postcopy() && !rdma->is_return_path) {
- rdma_return_path = qemu_rdma_data_init(rdma->host_port, NULL);
+ rdma_return_path = qemu_rdma_data_init(isock, NULL);
if (rdma_return_path == NULL) {
rdma_ack_cm_event(cm_event);
goto err_rdma_dest_wait;
@@ -4093,7 +4096,7 @@ static void rdma_accept_incoming_migration(void *opaque)
}
}
-void rdma_start_incoming_migration(const char *host_port, Error **errp)
+void rdma_start_incoming_migration(InetSocketAddress *addr, Error **errp)
{
int ret;
RDMAContext *rdma, *rdma_return_path = NULL;
@@ -4107,7 +4110,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
return;
}
- rdma = qemu_rdma_data_init(host_port, &local_err);
+ rdma = qemu_rdma_data_init(addr, &local_err);
if (rdma == NULL) {
goto err;
}
diff --git a/migration/rdma.h b/migration/rdma.h
index 8d9978e1a9..40673287a7 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -21,6 +21,6 @@
void rdma_start_outgoing_migration(void *opaque, InetSocketAddress *addr,
Error **errp);
-void rdma_start_incoming_migration(const char *host_port, Error **errp);
+void rdma_start_incoming_migration(InetSocketAddress *addr, Error **errp);
#endif
diff --git a/migration/socket.c b/migration/socket.c
index c751e0bfc1..6469d615d6 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -162,9 +162,8 @@ socket_incoming_migration_end(void *opaque)
object_unref(OBJECT(listener));
}
-static void
-socket_start_incoming_migration_internal(SocketAddress *saddr,
- Error **errp)
+void socket_start_incoming_migration(SocketAddress *saddr,
+ Error **errp)
{
QIONetListener *listener = qio_net_listener_new();
MigrationIncomingState *mis = migration_incoming_get_current();
@@ -202,14 +201,3 @@ socket_start_incoming_migration_internal(SocketAddress *saddr,
qapi_free_SocketAddress(address);
}
}
-
-void socket_start_incoming_migration(const char *str, Error **errp)
-{
- Error *err = NULL;
- SocketAddress *saddr = socket_parse(str, &err);
- if (!err) {
- socket_start_incoming_migration_internal(saddr, &err);
- }
- qapi_free_SocketAddress(saddr);
- error_propagate(errp, err);
-}
diff --git a/migration/socket.h b/migration/socket.h
index 95c9c166ec..4769a2bdf9 100644
--- a/migration/socket.h
+++ b/migration/socket.h
@@ -25,7 +25,7 @@ void socket_send_channel_create(QIOTaskFunc f, void *data);
QIOChannel *socket_send_channel_create_sync(Error **errp);
int socket_send_channel_destroy(QIOChannel *send);
-void socket_start_incoming_migration(const char *str, Error **errp);
+void socket_start_incoming_migration(SocketAddress *saddr, Error **errp);
void socket_start_outgoing_migration(MigrationState *s, SocketAddress *saddr,
Error **errp);
--
2.22.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file
2023-02-09 10:27 ` [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
@ 2023-02-09 11:56 ` Juan Quintela
2023-02-09 11:57 ` Daniel P. Berrangé
2023-02-09 12:04 ` Alex Bennée
2 siblings, 0 replies; 11+ messages in thread
From: Juan Quintela @ 2023-02-09 11:56 UTC (permalink / raw)
To: Het Gala
Cc: qemu-devel, prerna.saxena, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran
Het Gala <het.gala@nutanix.com> wrote:
> renamed hmp_split_at_comma() --> str_split_at_comma()
> Shifted helper function to qapi-util.c file. Give external linkage, as
> this function will be handy in coming commit for migration.
>
> Minor correction:
> g_strsplit(str ?: "", ",", -1) --> g_strsplit(str ? str : "", ",", -1)
>
Reviewed-by: Juan Quintela <quintela@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> Reviewed-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
But I can't find this reviewed by emails neither on list or in my INBOX.
You can add this lines when someone answer with a mail that explicitely
contains them.
Later, Juan.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file
2023-02-09 10:27 ` [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
2023-02-09 11:56 ` Juan Quintela
@ 2023-02-09 11:57 ` Daniel P. Berrangé
2023-02-09 12:04 ` Alex Bennée
2 siblings, 0 replies; 11+ messages in thread
From: Daniel P. Berrangé @ 2023-02-09 11:57 UTC (permalink / raw)
To: Het Gala
Cc: qemu-devel, prerna.saxena, quintela, dgilbert, pbonzini, armbru,
eblake, manish.mishra, aravind.retnakaran
On Thu, Feb 09, 2023 at 10:27:49AM +0000, Het Gala wrote:
> renamed hmp_split_at_comma() --> str_split_at_comma()
> Shifted helper function to qapi-util.c file. Give external linkage, as
> this function will be handy in coming commit for migration.
>
> Minor correction:
> g_strsplit(str ?: "", ",", -1) --> g_strsplit(str ? str : "", ",", -1)
>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> Reviewed-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Why have these Reviewed-by tags been added to this patch and all
others in the series ?
In the v2 posting all I see are some comments from Eric, and he
didn't give a Reviewed-by approval. I don't see any feedback from
Markus or David on list for the v2 posting.
> Suggested-by: Daniel P. Berrange <berrange@redhat.com>
> Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
> Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
> Signed-off-by: Het Gala <het.gala@nutanix.com>
> ---
> include/monitor/hmp.h | 1 -
> include/qapi/util.h | 1 +
> monitor/hmp-cmds.c | 19 -------------------
> net/net-hmp-cmds.c | 2 +-
> qapi/qapi-util.c | 19 +++++++++++++++++++
> stats/stats-hmp-cmds.c | 2 +-
> 6 files changed, 22 insertions(+), 22 deletions(-)
>
> diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
> index 2220f14fc9..e80848fbd0 100644
> --- a/include/monitor/hmp.h
> +++ b/include/monitor/hmp.h
> @@ -19,7 +19,6 @@
>
> bool hmp_handle_error(Monitor *mon, Error *err);
> void hmp_help_cmd(Monitor *mon, const char *name);
> -strList *hmp_split_at_comma(const char *str);
>
> void hmp_info_name(Monitor *mon, const QDict *qdict);
> void hmp_info_version(Monitor *mon, const QDict *qdict);
> diff --git a/include/qapi/util.h b/include/qapi/util.h
> index 81a2b13a33..6c8d8575e3 100644
> --- a/include/qapi/util.h
> +++ b/include/qapi/util.h
> @@ -29,6 +29,7 @@ bool qapi_bool_parse(const char *name, const char *value, bool *obj,
> Error **errp);
>
> int parse_qapi_name(const char *name, bool complete);
> +struct strList *str_split_at_comma(const char *str);
>
> /*
> * For any GenericList @list, insert @element at the front.
> diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
> index 34bd8c67d7..9665e6e0a5 100644
> --- a/monitor/hmp-cmds.c
> +++ b/monitor/hmp-cmds.c
> @@ -39,25 +39,6 @@ bool hmp_handle_error(Monitor *mon, Error *err)
> return false;
> }
>
> -/*
> - * Split @str at comma.
> - * A null @str defaults to "".
> - */
> -strList *hmp_split_at_comma(const char *str)
> -{
> - char **split = g_strsplit(str ?: "", ",", -1);
> - strList *res = NULL;
> - strList **tail = &res;
> - int i;
> -
> - for (i = 0; split[i]; i++) {
> - QAPI_LIST_APPEND(tail, split[i]);
> - }
> -
> - g_free(split);
> - return res;
> -}
> -
> void hmp_info_name(Monitor *mon, const QDict *qdict)
> {
> NameInfo *info;
> diff --git a/net/net-hmp-cmds.c b/net/net-hmp-cmds.c
> index 41d326bf5f..a3c597a727 100644
> --- a/net/net-hmp-cmds.c
> +++ b/net/net-hmp-cmds.c
> @@ -72,7 +72,7 @@ void hmp_announce_self(Monitor *mon, const QDict *qdict)
> migrate_announce_params());
>
> qapi_free_strList(params->interfaces);
> - params->interfaces = hmp_split_at_comma(interfaces_str);
> + params->interfaces = str_split_at_comma(interfaces_str);
> params->has_interfaces = params->interfaces != NULL;
> params->id = g_strdup(id);
> qmp_announce_self(params, NULL);
> diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
> index 63596e11c5..e26b9d957b 100644
> --- a/qapi/qapi-util.c
> +++ b/qapi/qapi-util.c
> @@ -152,3 +152,22 @@ int parse_qapi_name(const char *str, bool complete)
> }
> return p - str;
> }
> +
> +/*
> + * Split @str at comma.
> + * A null @str defaults to "".
> + */
> +strList *str_split_at_comma(const char *str)
> +{
> + char **split = g_strsplit(str ? str : "", ",", -1);
> + strList *res = NULL;
> + strList **tail = &res;
> + int i;
> +
> + for (i = 0; split[i]; i++) {
> + QAPI_LIST_APPEND(tail, split[i]);
> + }
> +
> + g_free(split);
> + return res;
> +}
> diff --git a/stats/stats-hmp-cmds.c b/stats/stats-hmp-cmds.c
> index 531e35d128..cfee05a076 100644
> --- a/stats/stats-hmp-cmds.c
> +++ b/stats/stats-hmp-cmds.c
> @@ -174,7 +174,7 @@ static StatsFilter *stats_filter(StatsTarget target, const char *names,
> request->provider = provider_idx;
> if (names && !g_str_equal(names, "*")) {
> request->has_names = true;
> - request->names = hmp_split_at_comma(names);
> + request->names = str_split_at_comma(names);
> }
> QAPI_LIST_PREPEND(request_list, request);
> }
> --
> 2.22.3
>
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 :|
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file
2023-02-09 10:27 ` [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
2023-02-09 11:56 ` Juan Quintela
2023-02-09 11:57 ` Daniel P. Berrangé
@ 2023-02-09 12:04 ` Alex Bennée
2 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2023-02-09 12:04 UTC (permalink / raw)
To: Het Gala
Cc: prerna.saxena, quintela, dgilbert, pbonzini, berrange, armbru,
eblake, manish.mishra, aravind.retnakaran, qemu-devel
Het Gala <het.gala@nutanix.com> writes:
> renamed hmp_split_at_comma() --> str_split_at_comma()
> Shifted helper function to qapi-util.c file. Give external linkage, as
> this function will be handy in coming commit for migration.
>
> Minor correction:
> g_strsplit(str ?: "", ",", -1) --> g_strsplit(str ? str : "", ",", -1)
>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> Reviewed-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
I think there has been a misunderstanding here about when to apply
review tags. Looking at v2:
Subject: [PATCH v2 1/6] migration: moved hmp_split_at_commma() helper func to
qapi-util.c file
Date: Wed, 8 Feb 2023 09:35:55 +0000
Message-Id: <20230208093600.242665-2-het.gala@nutanix.com>
I don't see any of the above developers responding to the message with
an explicit Reviewed-by tag email. We talk a bit about the process of
applying tags in:
https://qemu.readthedocs.io/en/latest/devel/submitting-a-patch.html#proper-use-of-reviewed-by-tags-can-aid-review
There are tools that can help. For example the b4 tool can fetch a
series from the mailing list (via kernel.org archives) and collect the
tags and apply them to the patches. It will also add Message-Id tags so
you can go directly to the thread when the patch was last discussed.
I would suggest you remove the tags and re-post a v4 of the series.
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command
2023-02-09 10:27 ` [PATCH v3 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command Het Gala
@ 2023-02-10 9:07 ` Markus Armbruster
0 siblings, 0 replies; 11+ messages in thread
From: Markus Armbruster @ 2023-02-10 9:07 UTC (permalink / raw)
To: Het Gala
Cc: qemu-devel, prerna.saxena, quintela, dgilbert, pbonzini, berrange,
eblake, manish.mishra, aravind.retnakaran
Just a quick one on naming before I forget:
Het Gala <het.gala@nutanix.com> writes:
> Existing 'migrate' QAPI design enforces transport mechanism, ip address
> of destination interface and corresponding port number in the form
> of a unified string 'uri' parameter for initiating a migration stream.
> This scheme has a significant flaw in it - double encoding of existing
> URIs to extract migration info.
>
> The current patch maps QAPI uri design onto well defined MigrateChannel
> struct. This modified QAPI helps in preventing multi-level uri
> encodings ('uri' parameter is kept for backward compatibility).
>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> Reviewed-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Suggested-by: Daniel P. Berrange <berrange@redhat.com>
> Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
> Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
> Signed-off-by: Het Gala <het.gala@nutanix.com>
> ---
> qapi/migration.json | 129 +++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 127 insertions(+), 2 deletions(-)
>
> diff --git a/qapi/migration.json b/qapi/migration.json
> index c84fa10e86..261a6770e7 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.json
> @@ -1449,12 +1449,106 @@
> ##
> { 'command': 'migrate-continue', 'data': {'state': 'MigrationStatus'} }
>
> +##
> +# @MigrateTransport:
> +#
> +# The supported communication transport mechanisms for migration
> +#
> +# @socket: Supported communication type between two devices for migration.
> +# Socket is able to cover all of 'tcp', 'unix', 'vsock' and
> +# 'fd' already
> +#
> +# @exec: Supported communication type to redirect migration stream into file.
> +#
> +# @rdma: Supported communication type to redirect rdma type migration stream.
> +#
> +# Since 8.0
> +##
> +{ 'enum': 'MigrateTransport',
> + 'data': ['socket', 'exec', 'rdma'] }
> +
> +##
> +# @MigrateSocketAddr:
> +#
> +# To support different type of socket.
> +#
> +# Since 8.0
> +##
> +{ 'struct': 'MigrateSocketAddr',
We tend to avoid abbreviations in QAPI schema names. For instance, it's
SocketAddress, not SocketAddr. Please use Address, not Addr, for
consistency.
> + 'data': {'data': 'SocketAddress' } }
> +
[...]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-02-10 9:08 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-09 10:27 [PATCH v3 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
2023-02-09 10:27 ` [PATCH v3 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
2023-02-09 11:56 ` Juan Quintela
2023-02-09 11:57 ` Daniel P. Berrangé
2023-02-09 12:04 ` Alex Bennée
2023-02-09 10:27 ` [PATCH v3 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command Het Gala
2023-02-10 9:07 ` Markus Armbruster
2023-02-09 10:27 ` [PATCH v3 3/6] migration: HMP side changes for modified 'migrate' QAPI design Het Gala
2023-02-09 10:27 ` [PATCH v3 4/6] migration: Avoid multiple parsing of uri in migration code flow Het Gala
2023-02-09 10:27 ` [PATCH v3 5/6] migration: Modified 'migrate-incoming' QAPI and HMP side changes on the destination interface Het Gala
2023-02-09 10:27 ` [PATCH v3 6/6] migration: Established connection for listener sockets on the dest interface Het Gala
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).