From: Peter Xu <peterx@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>,
Akash Kulhalli <akulhall@redhat.com>,
Juraj Marcin <jmarcin@redhat.com>
Subject: [PATCH 7/7] migration: Postpone the outgoing preempt channel for preempt_pre_7_2
Date: Wed, 16 Sep 2026 17:35:58 -0400 [thread overview]
Message-ID: <20260916213558.587304-8-peterx@redhat.com> (raw)
In-Reply-To: <20260916213558.587304-1-peterx@redhat.com>
This is the corresponding outgoing fix for the same problem mentioned in
the previous patch.
The idea is simple: either migration to an old QEMU or when TLS is enabled,
we rely on correct ordering of channels to make it work: first main, then
multifd, finally preempt.
This patch re-orders multifd and postcopy preempt channel on outgoing side,
but only for the old machine types where preempt_pre_7_2 set, to make it
follow the right orders to create the channels.
Keep the resume path alone because the resume path never involve multifd
channels, even if multifd is enabled. For that, fun fact: when multifd is
enabled with postcopy preempt, network interruption will break all multifd
channels, but they're never re-connected, until they got recycled at the
end of postcopy migration. OTOH, multifd_recv_all_channels_created()
reports true even after postcopy network down, as multifd_recv_state->count
is never decremented.
Fixes: e27418861288 ("migration: enable multifd and postcopy together")
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 32 +++++++++++++++++++++++---------
1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 4cc4077a76..f8d664808f 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -3733,6 +3733,20 @@ static void *migration_thread(void *opaque)
goto out;
}
+ /*
+ * Only for old 7.1/7.2 machine types running on new binaries (that
+ * supports multifd+postcopy+preempt). Makes sure to initiate the
+ * connect() after multifd channels because the old (broken) binaries
+ * assumes the order of channels, which we cannot fix anymore.
+ *
+ * multifd_send_setup() will make sure all multifd channels will be
+ * connected first, then initiate preempt channel here guarantees the
+ * ordering to those old binaries.
+ */
+ if (migrate_postcopy_preempt() && s->preempt_pre_7_2) {
+ postcopy_preempt_setup(s);
+ }
+
bql_lock();
qemu_savevm_state_header(s->to_dst_file);
bql_unlock();
@@ -4013,16 +4027,16 @@ void migration_start_outgoing(MigrationState *s)
open_return_path_on_source(s);
}
- /*
- * This needs to be done before resuming a postcopy. Note: for newer
- * QEMUs we will delay the channel creation until postcopy_start(), to
- * avoid disorder of channel creations.
- */
- if (migrate_postcopy_preempt() && s->preempt_pre_7_2) {
- postcopy_preempt_setup(s);
- }
-
if (resume) {
+ /*
+ * This needs to be done before resuming a postcopy. Note: for newer
+ * QEMUs we will delay the channel creation until postcopy_start(), to
+ * avoid disorder of channel creations.
+ */
+ if (migrate_postcopy_preempt() && s->preempt_pre_7_2) {
+ postcopy_preempt_setup(s);
+ }
+
/* Wakeup the main migration thread to do the recovery */
migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP,
MIGRATION_STATUS_POSTCOPY_RECOVER);
--
2.55.0
next prev parent reply other threads:[~2026-09-16 21:38 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-16 21:35 [PATCH 0/7] migration: Fix multifd+postcopy break on qemu-7.2 machine type Peter Xu
2026-09-16 21:35 ` [PATCH 1/7] tests/migration-test: Add multifd+postcopy test for preempt recovery Peter Xu
2026-09-16 21:35 ` [PATCH 2/7] migration: Add two more trace points for incoming channel mgmt Peter Xu
2026-09-16 21:35 ` [PATCH 3/7] migration: Fix socket listen backlog Peter Xu
2026-09-16 21:35 ` [PATCH 4/7] migration: Split migration_channel_process_incoming() Peter Xu
2026-09-16 21:35 ` [PATCH 5/7] migration: Dump type of channel in set_incoming_channel tracepoint Peter Xu
2026-09-16 21:35 ` [PATCH 6/7] migration: Fix incoming channel race with multifd and preempt_pre_7_2 Peter Xu
2026-09-23 15:54 ` Fabiano Rosas
2026-09-23 21:04 ` Peter Xu
2026-09-23 22:15 ` Fabiano Rosas
2026-09-24 21:54 ` Fabiano Rosas
2026-09-28 19:22 ` Peter Xu
2026-09-28 20:38 ` Fabiano Rosas
2026-09-29 20:00 ` Peter Xu
2026-09-16 21:35 ` Peter Xu [this message]
2026-09-22 23:34 ` [PATCH 7/7] migration: Postpone the outgoing preempt channel for preempt_pre_7_2 Fabiano Rosas
2026-09-23 20:24 ` Peter Xu
2026-09-23 22:30 ` Fabiano Rosas
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=20260916213558.587304-8-peterx@redhat.com \
--to=peterx@redhat.com \
--cc=akulhall@redhat.com \
--cc=farosas@suse.de \
--cc=jmarcin@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 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.