diff options
author | Richard Henderson | 2021-10-19 16:41:04 +0200 |
---|---|---|
committer | Richard Henderson | 2021-10-19 16:41:04 +0200 |
commit | 50352cce138ef3b30c1cda28a4df68fff5da3202 (patch) | |
tree | cac0f47717ae21a351c720847fedb41425a10263 /migration/multifd.c | |
parent | Merge remote-tracking branch 'remotes/bsdimp/tags/pull-bsd-user-20211018-pull... (diff) | |
parent | migration/rdma: advise prefetch write for ODP region (diff) | |
download | qemu-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.c | 35 |
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); |