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>,
"Daniel P. Berrangé" <berrange@redhat.com>
Subject: [PATCH 3/7] migration: Fix socket listen backlog
Date: Wed, 16 Sep 2026 17:35:54 -0400 [thread overview]
Message-ID: <20260916213558.587304-4-peterx@redhat.com> (raw)
In-Reply-To: <20260916213558.587304-1-peterx@redhat.com>
QEMU incoming side may have set a wrong listen() backlog. After the
support of multifd + postcopy now we have four possibilities on setting the
backlog, some of them are wrong:
Vanilla: 1 (correct)
Multifd: N (wrong, should be N+1)
Preempt: 2 (correct)
Multifd+Preempt: N (wrong, should be N+2)
No real report for this, found by code observation only. Logically the
backlog (pending accept requests on destination on the listening sockets)
needs to be the maximum of possible channels. Otherwise if the accept
queue full on destination, source QEMU may hit connection errors.
Cc: Daniel P. Berrangé <berrange@redhat.com>
Fixes: 0705e56496 ("multifd: Use number of channels as listen backlog")
Fixes: e274188612 ("migration: enable multifd and postcopy together")
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/socket.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/migration/socket.c b/migration/socket.c
index f57f1a8e7c..31bfa1eeeb 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -139,21 +139,32 @@ socket_incoming_migration_end(void *opaque)
object_unref(OBJECT(listener));
}
+static int socket_get_max_channels(void)
+{
+ /* The main channel is always wanted */
+ int num = 1;
+
+ if (migrate_multifd()) {
+ num += migrate_multifd_channels();
+ }
+
+ if (migrate_postcopy_preempt()) {
+ /* The preempt channel */
+ num += 1;
+ }
+
+ return num;
+}
+
void socket_connect_incoming(SocketAddress *saddr, Error **errp)
{
QIONetListener *listener = qio_net_listener_new();
MigrationIncomingState *mis = migration_incoming_get_current();
size_t i;
- int num = 1;
+ int num = socket_get_max_channels();
qio_net_listener_set_name(listener, "migration-socket-listener");
- if (migrate_multifd()) {
- num = migrate_multifd_channels();
- } else if (migrate_postcopy_preempt()) {
- num = RAM_CHANNEL_MAX;
- }
-
if (qio_net_listener_open_sync(listener, saddr, num, errp) < 0) {
object_unref(OBJECT(listener));
return;
--
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 ` Peter Xu [this message]
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 ` [PATCH 7/7] migration: Postpone the outgoing preempt channel for preempt_pre_7_2 Peter Xu
2026-09-22 23:34 ` 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-4-peterx@redhat.com \
--to=peterx@redhat.com \
--cc=akulhall@redhat.com \
--cc=berrange@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.