summaryrefslogtreecommitdiffstats
path: root/migration/multifd.c
diff options
context:
space:
mode:
authorRichard Henderson2021-10-19 16:41:04 +0200
committerRichard Henderson2021-10-19 16:41:04 +0200
commit50352cce138ef3b30c1cda28a4df68fff5da3202 (patch)
treecac0f47717ae21a351c720847fedb41425a10263 /migration/multifd.c
parentMerge remote-tracking branch 'remotes/bsdimp/tags/pull-bsd-user-20211018-pull... (diff)
parentmigration/rdma: advise prefetch write for ODP region (diff)
downloadqemu-50352cce138ef3b30c1cda28a4df68fff5da3202.tar.gz
qemu-50352cce138ef3b30c1cda28a4df68fff5da3202.tar.xz
qemu-50352cce138ef3b30c1cda28a4df68fff5da3202.zip
Merge remote-tracking branch 'remotes/juanquintela/tags/migration.next-pull-request' into staging
Migration Pull request (3rd try) Hi This should fix all the freebsd problems. Please apply, # gpg: Signature made Tue 19 Oct 2021 02:28:51 AM PDT # gpg: using RSA key 1899FF8EDEBF58CCEE034B82F487EF185872D723 # gpg: Good signature from "Juan Quintela <quintela@redhat.com>" [full] # gpg: aka "Juan Quintela <quintela@trasno.org>" [full] * remotes/juanquintela/tags/migration.next-pull-request: migration/rdma: advise prefetch write for ODP region migration/rdma: Try to register On-Demand Paging memory region migration: allow enabling mutilfd for specific protocol only migration: allow multifd for socket protocol only migration/ram: Don't passs RAMState to migration_clear_memory_region_dirty_bitmap_*() multifd: Unconditionally unregister yank function multifd: Implement yank for multifd send side Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'migration/multifd.c')
-rw-r--r--migration/multifd.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/migration/multifd.c b/migration/multifd.c
index 377da78f5b..7c9deb1921 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);
@@ -546,6 +546,9 @@ void multifd_save_cleanup(void)
MultiFDSendParams *p = &multifd_send_state->params[i];
Error *local_err = NULL;
+ if (p->registered_yank) {
+ migration_ioc_unregister_yank(p->c);
+ }
socket_send_channel_destroy(p->c);
p->c = NULL;
qemu_mutex_destroy(&p->mutex);
@@ -813,7 +816,8 @@ static bool multifd_channel_connect(MultiFDSendParams *p,
return false;
}
} else {
- /* update for tls qio channel */
+ migration_ioc_register_yank(ioc);
+ p->registered_yank = true;
p->c = ioc;
qemu_thread_create(&p->thread, p->name, multifd_send_thread, p,
QEMU_THREAD_JOINABLE);
@@ -864,6 +868,17 @@ cleanup:
multifd_new_send_channel_cleanup(p, sioc, local_err);
}
+static bool migrate_allow_multifd = true;
+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 +889,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 +987,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);
@@ -987,10 +1007,7 @@ int multifd_load_cleanup(Error **errp)
for (i = 0; i < migrate_multifd_channels(); i++) {
MultiFDRecvParams *p = &multifd_recv_state->params[i];
- if (OBJECT(p->c)->ref == 1) {
- migration_ioc_unregister_yank(p->c);
- }
-
+ migration_ioc_unregister_yank(p->c);
object_unref(OBJECT(p->c));
p->c = NULL;
qemu_mutex_destroy(&p->mutex);
@@ -1119,6 +1136,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);