* [PATCH v2 1/2] migration: allow multifd for socket protocol only
@ 2021-07-31 14:05 Li Zhijian
2021-07-31 14:05 ` [PATCH v2 2/2] migration: allow enabling mutilfd for specific " Li Zhijian
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Li Zhijian @ 2021-07-31 14:05 UTC (permalink / raw)
To: quintela, dgilbert, qemu-devel; +Cc: Li Zhijian
multifd with unsupported protocol will cause a segment fault.
(gdb) bt
#0 0x0000563b4a93faf8 in socket_connect (addr=0x0, errp=0x7f7f02675410) at ../util/qemu-sockets.c:1190
#1 0x0000563b4a797a03 in qio_channel_socket_connect_sync (ioc=0x563b4d16e8c0, addr=0x0, errp=0x7f7f02675410) at ../io/channel-socket.c:145
#2 0x0000563b4a797abf in qio_channel_socket_connect_worker (task=0x563b4cd86c30, opaque=0x0) at ../io/channel-socket.c:168
#3 0x0000563b4a792631 in qio_task_thread_worker (opaque=0x563b4cd86c30) at ../io/task.c:124
#4 0x0000563b4a91da69 in qemu_thread_start (args=0x563b4c44bb80) at ../util/qemu-thread-posix.c:541
#5 0x00007f7fe9b5b3f9 in ?? ()
#6 0x0000000000000000 in ?? ()
It's enough to check migrate_multifd_is_allowed() in multifd cleanup() and
multifd setup() though there are so many other places using migrate_use_multifd().
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
---
migration/migration.c | 4 ++++
migration/multifd.c | 24 ++++++++++++++++++++++--
migration/multifd.h | 2 ++
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 2d306582ebf..212314541f1 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -456,10 +456,12 @@ static void qemu_start_incoming_migration(const char *uri, Error **errp)
{
const char *p = NULL;
+ migrate_protocol_allow_multifd(false); /* reset it anyway */
qapi_event_send_migration(MIGRATION_STATUS_SETUP);
if (strstart(uri, "tcp:", &p) ||
strstart(uri, "unix:", NULL) ||
strstart(uri, "vsock:", NULL)) {
+ migrate_protocol_allow_multifd(true);
socket_start_incoming_migration(p ? p : uri, errp);
#ifdef CONFIG_RDMA
} else if (strstart(uri, "rdma:", &p)) {
@@ -2289,9 +2291,11 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
}
}
+ migrate_protocol_allow_multifd(false);
if (strstart(uri, "tcp:", &p) ||
strstart(uri, "unix:", NULL) ||
strstart(uri, "vsock:", NULL)) {
+ migrate_protocol_allow_multifd(true);
socket_start_outgoing_migration(s, p ? p : uri, &local_err);
#ifdef CONFIG_RDMA
} else if (strstart(uri, "rdma:", &p)) {
diff --git a/migration/multifd.c b/migration/multifd.c
index ab41590e714..4a4d16d3888 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -531,7 +531,7 @@ void multifd_save_cleanup(void)
{
int i;
- if (!migrate_use_multifd()) {
+ if (!migrate_use_multifd() || !migrate_multifd_is_allowed()) {
return;
}
multifd_send_terminate_threads(NULL);
@@ -864,6 +864,17 @@ cleanup:
multifd_new_send_channel_cleanup(p, sioc, local_err);
}
+static bool migrate_allow_multifd;
+void migrate_protocol_allow_multifd(bool allow)
+{
+ migrate_allow_multifd = allow;
+}
+
+bool migrate_multifd_is_allowed(void)
+{
+ return migrate_allow_multifd;
+}
+
int multifd_save_setup(Error **errp)
{
int thread_count;
@@ -874,6 +885,11 @@ int multifd_save_setup(Error **errp)
if (!migrate_use_multifd()) {
return 0;
}
+ if (!migrate_multifd_is_allowed()) {
+ error_setg(errp, "multifd is not supported by current protocol");
+ return -1;
+ }
+
s = migrate_get_current();
thread_count = migrate_multifd_channels();
multifd_send_state = g_malloc0(sizeof(*multifd_send_state));
@@ -967,7 +983,7 @@ int multifd_load_cleanup(Error **errp)
{
int i;
- if (!migrate_use_multifd()) {
+ if (!migrate_use_multifd() || !migrate_multifd_is_allowed()) {
return 0;
}
multifd_recv_terminate_threads(NULL);
@@ -1123,6 +1139,10 @@ int multifd_load_setup(Error **errp)
if (!migrate_use_multifd()) {
return 0;
}
+ if (!migrate_multifd_is_allowed()) {
+ error_setg(errp, "multifd is not supported by current protocol");
+ return -1;
+ }
thread_count = migrate_multifd_channels();
multifd_recv_state = g_malloc0(sizeof(*multifd_recv_state));
multifd_recv_state->params = g_new0(MultiFDRecvParams, thread_count);
diff --git a/migration/multifd.h b/migration/multifd.h
index 8d6751f5ed8..f62a1becd0b 100644
--- a/migration/multifd.h
+++ b/migration/multifd.h
@@ -13,6 +13,8 @@
#ifndef QEMU_MIGRATION_MULTIFD_H
#define QEMU_MIGRATION_MULTIFD_H
+bool migrate_multifd_is_allowed(void);
+void migrate_protocol_allow_multifd(bool allow);
int multifd_save_setup(Error **errp);
void multifd_save_cleanup(void);
int multifd_load_setup(Error **errp);
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] migration: allow enabling mutilfd for specific protocol only
2021-07-31 14:05 [PATCH v2 1/2] migration: allow multifd for socket protocol only Li Zhijian
@ 2021-07-31 14:05 ` Li Zhijian
2021-09-09 7:30 ` Juan Quintela
2021-08-23 3:32 ` [PATCH v2 1/2] migration: allow multifd for socket " lizhijian
2021-09-09 7:28 ` Juan Quintela
2 siblings, 1 reply; 5+ messages in thread
From: Li Zhijian @ 2021-07-31 14:05 UTC (permalink / raw)
To: quintela, dgilbert, qemu-devel; +Cc: Li Zhijian
And change the default to true so that in '-incoming defer' case, user is able
to change multifd capability.
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
---
migration/migration.c | 8 ++++++++
migration/multifd.c | 2 +-
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/migration/migration.c b/migration/migration.c
index 212314541f1..b4d0e66cf7b 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1249,6 +1249,14 @@ static bool migrate_caps_check(bool *cap_list,
}
}
+ /* incoming side only */
+ if (runstate_check(RUN_STATE_INMIGRATE) &&
+ !migrate_multifd_is_allowed() &&
+ cap_list[MIGRATION_CAPABILITY_MULTIFD]) {
+ error_setg(errp, "multifd is not supported by current protocol");
+ return false;
+ }
+
return true;
}
diff --git a/migration/multifd.c b/migration/multifd.c
index 4a4d16d3888..4643b25c9db 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -864,7 +864,7 @@ cleanup:
multifd_new_send_channel_cleanup(p, sioc, local_err);
}
-static bool migrate_allow_multifd;
+static bool migrate_allow_multifd = true;
void migrate_protocol_allow_multifd(bool allow)
{
migrate_allow_multifd = allow;
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] migration: allow multifd for socket protocol only
2021-07-31 14:05 [PATCH v2 1/2] migration: allow multifd for socket protocol only Li Zhijian
2021-07-31 14:05 ` [PATCH v2 2/2] migration: allow enabling mutilfd for specific " Li Zhijian
@ 2021-08-23 3:32 ` lizhijian
2021-09-09 7:28 ` Juan Quintela
2 siblings, 0 replies; 5+ messages in thread
From: lizhijian @ 2021-08-23 3:32 UTC (permalink / raw)
To: lizhijian, quintela, dgilbert, qemu-devel
kindly ping
On 31/07/2021 22:05, Li Zhijian wrote:
> multifd with unsupported protocol will cause a segment fault.
> (gdb) bt
> #0 0x0000563b4a93faf8 in socket_connect (addr=0x0, errp=0x7f7f02675410) at ../util/qemu-sockets.c:1190
> #1 0x0000563b4a797a03 in qio_channel_socket_connect_sync (ioc=0x563b4d16e8c0, addr=0x0, errp=0x7f7f02675410) at ../io/channel-socket.c:145
> #2 0x0000563b4a797abf in qio_channel_socket_connect_worker (task=0x563b4cd86c30, opaque=0x0) at ../io/channel-socket.c:168
> #3 0x0000563b4a792631 in qio_task_thread_worker (opaque=0x563b4cd86c30) at ../io/task.c:124
> #4 0x0000563b4a91da69 in qemu_thread_start (args=0x563b4c44bb80) at ../util/qemu-thread-posix.c:541
> #5 0x00007f7fe9b5b3f9 in ?? ()
> #6 0x0000000000000000 in ?? ()
>
> It's enough to check migrate_multifd_is_allowed() in multifd cleanup() and
> multifd setup() though there are so many other places using migrate_use_multifd().
>
> Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
> ---
> migration/migration.c | 4 ++++
> migration/multifd.c | 24 ++++++++++++++++++++++--
> migration/multifd.h | 2 ++
> 3 files changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 2d306582ebf..212314541f1 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -456,10 +456,12 @@ static void qemu_start_incoming_migration(const char *uri, Error **errp)
> {
> const char *p = NULL;
>
> + migrate_protocol_allow_multifd(false); /* reset it anyway */
> qapi_event_send_migration(MIGRATION_STATUS_SETUP);
> if (strstart(uri, "tcp:", &p) ||
> strstart(uri, "unix:", NULL) ||
> strstart(uri, "vsock:", NULL)) {
> + migrate_protocol_allow_multifd(true);
> socket_start_incoming_migration(p ? p : uri, errp);
> #ifdef CONFIG_RDMA
> } else if (strstart(uri, "rdma:", &p)) {
> @@ -2289,9 +2291,11 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
> }
> }
>
> + migrate_protocol_allow_multifd(false);
> if (strstart(uri, "tcp:", &p) ||
> strstart(uri, "unix:", NULL) ||
> strstart(uri, "vsock:", NULL)) {
> + migrate_protocol_allow_multifd(true);
> socket_start_outgoing_migration(s, p ? p : uri, &local_err);
> #ifdef CONFIG_RDMA
> } else if (strstart(uri, "rdma:", &p)) {
> diff --git a/migration/multifd.c b/migration/multifd.c
> index ab41590e714..4a4d16d3888 100644
> --- a/migration/multifd.c
> +++ b/migration/multifd.c
> @@ -531,7 +531,7 @@ void multifd_save_cleanup(void)
> {
> int i;
>
> - if (!migrate_use_multifd()) {
> + if (!migrate_use_multifd() || !migrate_multifd_is_allowed()) {
> return;
> }
> multifd_send_terminate_threads(NULL);
> @@ -864,6 +864,17 @@ cleanup:
> multifd_new_send_channel_cleanup(p, sioc, local_err);
> }
>
> +static bool migrate_allow_multifd;
> +void migrate_protocol_allow_multifd(bool allow)
> +{
> + migrate_allow_multifd = allow;
> +}
> +
> +bool migrate_multifd_is_allowed(void)
> +{
> + return migrate_allow_multifd;
> +}
> +
> int multifd_save_setup(Error **errp)
> {
> int thread_count;
> @@ -874,6 +885,11 @@ int multifd_save_setup(Error **errp)
> if (!migrate_use_multifd()) {
> return 0;
> }
> + if (!migrate_multifd_is_allowed()) {
> + error_setg(errp, "multifd is not supported by current protocol");
> + return -1;
> + }
> +
> s = migrate_get_current();
> thread_count = migrate_multifd_channels();
> multifd_send_state = g_malloc0(sizeof(*multifd_send_state));
> @@ -967,7 +983,7 @@ int multifd_load_cleanup(Error **errp)
> {
> int i;
>
> - if (!migrate_use_multifd()) {
> + if (!migrate_use_multifd() || !migrate_multifd_is_allowed()) {
> return 0;
> }
> multifd_recv_terminate_threads(NULL);
> @@ -1123,6 +1139,10 @@ int multifd_load_setup(Error **errp)
> if (!migrate_use_multifd()) {
> return 0;
> }
> + if (!migrate_multifd_is_allowed()) {
> + error_setg(errp, "multifd is not supported by current protocol");
> + return -1;
> + }
> thread_count = migrate_multifd_channels();
> multifd_recv_state = g_malloc0(sizeof(*multifd_recv_state));
> multifd_recv_state->params = g_new0(MultiFDRecvParams, thread_count);
> diff --git a/migration/multifd.h b/migration/multifd.h
> index 8d6751f5ed8..f62a1becd0b 100644
> --- a/migration/multifd.h
> +++ b/migration/multifd.h
> @@ -13,6 +13,8 @@
> #ifndef QEMU_MIGRATION_MULTIFD_H
> #define QEMU_MIGRATION_MULTIFD_H
>
> +bool migrate_multifd_is_allowed(void);
> +void migrate_protocol_allow_multifd(bool allow);
> int multifd_save_setup(Error **errp);
> void multifd_save_cleanup(void);
> int multifd_load_setup(Error **errp);
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] migration: allow multifd for socket protocol only
2021-07-31 14:05 [PATCH v2 1/2] migration: allow multifd for socket protocol only Li Zhijian
2021-07-31 14:05 ` [PATCH v2 2/2] migration: allow enabling mutilfd for specific " Li Zhijian
2021-08-23 3:32 ` [PATCH v2 1/2] migration: allow multifd for socket " lizhijian
@ 2021-09-09 7:28 ` Juan Quintela
2 siblings, 0 replies; 5+ messages in thread
From: Juan Quintela @ 2021-09-09 7:28 UTC (permalink / raw)
To: Li Zhijian; +Cc: dgilbert, qemu-devel
Li Zhijian <lizhijian@cn.fujitsu.com> wrote:
> multifd with unsupported protocol will cause a segment fault.
> (gdb) bt
> #0 0x0000563b4a93faf8 in socket_connect (addr=0x0, errp=0x7f7f02675410) at ../util/qemu-sockets.c:1190
> #1 0x0000563b4a797a03 in qio_channel_socket_connect_sync
> (ioc=0x563b4d16e8c0, addr=0x0, errp=0x7f7f02675410) at
> ../io/channel-socket.c:145
> #2 0x0000563b4a797abf in qio_channel_socket_connect_worker (task=0x563b4cd86c30, opaque=0x0) at ../io/channel-socket.c:168
> #3 0x0000563b4a792631 in qio_task_thread_worker (opaque=0x563b4cd86c30) at ../io/task.c:124
> #4 0x0000563b4a91da69 in qemu_thread_start (args=0x563b4c44bb80) at ../util/qemu-thread-posix.c:541
> #5 0x00007f7fe9b5b3f9 in ?? ()
> #6 0x0000000000000000 in ?? ()
>
> It's enough to check migrate_multifd_is_allowed() in multifd cleanup() and
> multifd setup() though there are so many other places using migrate_use_multifd().
>
> Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] migration: allow enabling mutilfd for specific protocol only
2021-07-31 14:05 ` [PATCH v2 2/2] migration: allow enabling mutilfd for specific " Li Zhijian
@ 2021-09-09 7:30 ` Juan Quintela
0 siblings, 0 replies; 5+ messages in thread
From: Juan Quintela @ 2021-09-09 7:30 UTC (permalink / raw)
To: Li Zhijian; +Cc: dgilbert, qemu-devel
Li Zhijian <lizhijian@cn.fujitsu.com> wrote:
> And change the default to true so that in '-incoming defer' case, user is able
> to change multifd capability.
>
> Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-09-09 7:34 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-31 14:05 [PATCH v2 1/2] migration: allow multifd for socket protocol only Li Zhijian
2021-07-31 14:05 ` [PATCH v2 2/2] migration: allow enabling mutilfd for specific " Li Zhijian
2021-09-09 7:30 ` Juan Quintela
2021-08-23 3:32 ` [PATCH v2 1/2] migration: allow multifd for socket " lizhijian
2021-09-09 7:28 ` Juan Quintela
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.