* [PATCH v4 0/2] migration: Support socket fd for CPR and fix @ 2025-06-11 20:56 Jaehoon Kim 2025-06-11 20:56 ` [PATCH v4 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Jaehoon Kim 2025-06-11 20:56 ` [PATCH v4 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim 0 siblings, 2 replies; 6+ messages in thread From: Jaehoon Kim @ 2025-06-11 20:56 UTC (permalink / raw) To: qemu-devel Cc: jjherne, steven.sistare, peterx, farosas, lvivier, pbonzini, Jaehoon Kim Hello, This is v4 of the patch series. Changes since v3: - [Patch 1/2]: Applid review feedback from Steve Sistare - now using '%d' in g_strdup_printf - [Patch 2/2]: No changes; Kept as-is with Reviewed-by from Steve Sistare. Jaehoon Kim (2): tests/migration: Setup pre-listened cpr.sock to remove race-condition. migration: Support fd-based socket address in cpr_transfer_input migration/cpr-transfer.c | 7 +++++-- tests/qtest/migration/cpr-tests.c | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) -- 2.49.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition. 2025-06-11 20:56 [PATCH v4 0/2] migration: Support socket fd for CPR and fix Jaehoon Kim @ 2025-06-11 20:56 ` Jaehoon Kim 2025-06-12 13:33 ` Steven Sistare 2025-06-11 20:56 ` [PATCH v4 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim 1 sibling, 1 reply; 6+ messages in thread From: Jaehoon Kim @ 2025-06-11 20:56 UTC (permalink / raw) To: qemu-devel Cc: jjherne, steven.sistare, peterx, farosas, lvivier, pbonzini, Jaehoon Kim When the source VM attempts to connect to the destination VM's Unix domain socket (cpr.sock) during a cpr-transfer test, race conditions can occur if the socket file isn't ready. This can lead to connection failures when running tests. This patch creates and listens on the socket in advance, and passes the pre-listened FD directly. This avoids timing issues and improves the reliability of CPR tests. Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com> Signed-off-by: Jaehoon Kim <jhkim@linux.ibm.com> --- tests/qtest/migration/cpr-tests.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c index 5536e14610..f7bd5c4666 100644 --- a/tests/qtest/migration/cpr-tests.c +++ b/tests/qtest/migration/cpr-tests.c @@ -60,13 +60,12 @@ static void test_mode_transfer_common(bool incoming_defer) g_autofree char *cpr_path = g_strdup_printf("%s/cpr.sock", tmpfs); g_autofree char *mig_path = g_strdup_printf("%s/migsocket", tmpfs); g_autofree char *uri = g_strdup_printf("unix:%s", mig_path); + g_autofree char *opts_target; const char *opts = "-machine aux-ram-share=on -nodefaults"; g_autofree const char *cpr_channel = g_strdup_printf( "cpr,addr.transport=socket,addr.type=unix,addr.path=%s", cpr_path); - g_autofree char *opts_target = g_strdup_printf("-incoming %s %s", - cpr_channel, opts); g_autofree char *connect_channels = g_strdup_printf( "[ { 'channel-type': 'main'," @@ -75,6 +74,17 @@ static void test_mode_transfer_common(bool incoming_defer) " 'path': '%s' } } ]", mig_path); + /* + * Set up a UNIX domain socket for the CPR channel before + * launching the destination VM, to avoid timing issues + * during connection setup. + */ + int cpr_sockfd = qtest_socket_server(cpr_path); + g_assert(cpr_sockfd >= 0); + + opts_target = g_strdup_printf("-incoming cpr,addr.transport=socket," + "addr.type=fd,addr.str=%d %s", + cpr_sockfd, opts); MigrateCommon args = { .start.opts_source = opts, .start.opts_target = opts_target, -- 2.49.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition. 2025-06-11 20:56 ` [PATCH v4 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Jaehoon Kim @ 2025-06-12 13:33 ` Steven Sistare 0 siblings, 0 replies; 6+ messages in thread From: Steven Sistare @ 2025-06-12 13:33 UTC (permalink / raw) To: Jaehoon Kim, qemu-devel; +Cc: jjherne, peterx, farosas, lvivier, pbonzini On 6/11/2025 4:56 PM, Jaehoon Kim wrote: > When the source VM attempts to connect to the destination VM's Unix > domain socket (cpr.sock) during a cpr-transfer test, race conditions can > occur if the socket file isn't ready. This can lead to connection > failures when running tests. > > This patch creates and listens on the socket in advance, and passes the > pre-listened FD directly. This avoids timing issues and improves the > reliability of CPR tests. > > Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com> > Signed-off-by: Jaehoon Kim <jhkim@linux.ibm.com> > --- > tests/qtest/migration/cpr-tests.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c > index 5536e14610..f7bd5c4666 100644 > --- a/tests/qtest/migration/cpr-tests.c > +++ b/tests/qtest/migration/cpr-tests.c > @@ -60,13 +60,12 @@ static void test_mode_transfer_common(bool incoming_defer) > g_autofree char *cpr_path = g_strdup_printf("%s/cpr.sock", tmpfs); > g_autofree char *mig_path = g_strdup_printf("%s/migsocket", tmpfs); > g_autofree char *uri = g_strdup_printf("unix:%s", mig_path); > + g_autofree char *opts_target; This must be initialized. Otherwise, if the function returns before opts_target is assigned, then a garbage pointer can be freed. g_autofree char *opts_target = NULL; Sorry I did not catch that before. > const char *opts = "-machine aux-ram-share=on -nodefaults"; > g_autofree const char *cpr_channel = g_strdup_printf( > "cpr,addr.transport=socket,addr.type=unix,addr.path=%s", > cpr_path); > - g_autofree char *opts_target = g_strdup_printf("-incoming %s %s", > - cpr_channel, opts); > > g_autofree char *connect_channels = g_strdup_printf( > "[ { 'channel-type': 'main'," > @@ -75,6 +74,17 @@ static void test_mode_transfer_common(bool incoming_defer) > " 'path': '%s' } } ]", > mig_path); > > + /* > + * Set up a UNIX domain socket for the CPR channel before > + * launching the destination VM, to avoid timing issues > + * during connection setup. > + */ > + int cpr_sockfd = qtest_socket_server(cpr_path); > + g_assert(cpr_sockfd >= 0); > + > + opts_target = g_strdup_printf("-incoming cpr,addr.transport=socket," > + "addr.type=fd,addr.str=%d %s", > + cpr_sockfd, opts); Or, declare and assign the final value together: g_autofree char *opts_target = g_strdup_printf( "-incoming cpr,addr.transport=socket,addr.type=fd,addr.str=%d %s", cpr_sockfd, opts); With either change: Reviewed-by: Steve Sistare <steven.sistare@oracle.com> Thanks very much for fixing the cpr tests. - Steve > MigrateCommon args = { > .start.opts_source = opts, > .start.opts_target = opts_target, ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 2/2] migration: Support fd-based socket address in cpr_transfer_input 2025-06-11 20:56 [PATCH v4 0/2] migration: Support socket fd for CPR and fix Jaehoon Kim 2025-06-11 20:56 ` [PATCH v4 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Jaehoon Kim @ 2025-06-11 20:56 ` Jaehoon Kim 2025-06-12 13:41 ` Daniel P. Berrangé 1 sibling, 1 reply; 6+ messages in thread From: Jaehoon Kim @ 2025-06-11 20:56 UTC (permalink / raw) To: qemu-devel Cc: jjherne, steven.sistare, peterx, farosas, lvivier, pbonzini, Jaehoon Kim Extend cpr_transfer_input to handle SOCKET_ADDRESS_TYPE_FD alongside SOCKET_ADDRESS_TYPE_UNIX. This change supports the use of pre-listened socket file descriptors for cpr migration channels. This change is particularly useful in qtest environments, where the socket may be created externally and passed via fd. Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com> Reviewed-by: Steve Sistare <steven.sistare@oracle.com> Signed-off-by: Jaehoon Kim <jhkim@linux.ibm.com> --- migration/cpr-transfer.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/migration/cpr-transfer.c b/migration/cpr-transfer.c index e1f140359c..00371d17c3 100644 --- a/migration/cpr-transfer.c +++ b/migration/cpr-transfer.c @@ -46,7 +46,8 @@ QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp) MigrationAddress *addr = channel->addr; if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET && - addr->u.socket.type == SOCKET_ADDRESS_TYPE_UNIX) { + (addr->u.socket.type == SOCKET_ADDRESS_TYPE_UNIX || + addr->u.socket.type == SOCKET_ADDRESS_TYPE_FD)) { g_autoptr(QIOChannelSocket) sioc = NULL; SocketAddress *saddr = &addr->u.socket; @@ -60,7 +61,9 @@ QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp) sioc = qio_net_listener_wait_client(listener); ioc = QIO_CHANNEL(sioc); - trace_cpr_transfer_input(addr->u.socket.u.q_unix.path); + trace_cpr_transfer_input( + addr->u.socket.type == SOCKET_ADDRESS_TYPE_UNIX ? + addr->u.socket.u.q_unix.path : addr->u.socket.u.fd.str); qio_channel_set_name(ioc, "cpr-in"); return qemu_file_new_input(ioc); -- 2.49.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 2/2] migration: Support fd-based socket address in cpr_transfer_input 2025-06-11 20:56 ` [PATCH v4 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim @ 2025-06-12 13:41 ` Daniel P. Berrangé 2025-06-12 14:37 ` Peter Xu 0 siblings, 1 reply; 6+ messages in thread From: Daniel P. Berrangé @ 2025-06-12 13:41 UTC (permalink / raw) To: Jaehoon Kim Cc: qemu-devel, jjherne, steven.sistare, peterx, farosas, lvivier, pbonzini On Wed, Jun 11, 2025 at 03:56:10PM -0500, Jaehoon Kim wrote: > Extend cpr_transfer_input to handle SOCKET_ADDRESS_TYPE_FD alongside > SOCKET_ADDRESS_TYPE_UNIX. This change supports the use of pre-listened > socket file descriptors for cpr migration channels. > > This change is particularly useful in qtest environments, where the > socket may be created externally and passed via fd. > > Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com> > Reviewed-by: Steve Sistare <steven.sistare@oracle.com> > Signed-off-by: Jaehoon Kim <jhkim@linux.ibm.com> > --- > migration/cpr-transfer.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) This patch *MUST* be first in the series, otherwise 'git bisect' will hit test failures on the former patch. > > diff --git a/migration/cpr-transfer.c b/migration/cpr-transfer.c > index e1f140359c..00371d17c3 100644 > --- a/migration/cpr-transfer.c > +++ b/migration/cpr-transfer.c > @@ -46,7 +46,8 @@ QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp) > MigrationAddress *addr = channel->addr; > > if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET && > - addr->u.socket.type == SOCKET_ADDRESS_TYPE_UNIX) { > + (addr->u.socket.type == SOCKET_ADDRESS_TYPE_UNIX || > + addr->u.socket.type == SOCKET_ADDRESS_TYPE_FD)) { > > g_autoptr(QIOChannelSocket) sioc = NULL; > SocketAddress *saddr = &addr->u.socket; > @@ -60,7 +61,9 @@ QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp) > > sioc = qio_net_listener_wait_client(listener); > ioc = QIO_CHANNEL(sioc); > - trace_cpr_transfer_input(addr->u.socket.u.q_unix.path); > + trace_cpr_transfer_input( > + addr->u.socket.type == SOCKET_ADDRESS_TYPE_UNIX ? > + addr->u.socket.u.q_unix.path : addr->u.socket.u.fd.str); > qio_channel_set_name(ioc, "cpr-in"); > return qemu_file_new_input(ioc); > > -- > 2.49.0 > > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 2/2] migration: Support fd-based socket address in cpr_transfer_input 2025-06-12 13:41 ` Daniel P. Berrangé @ 2025-06-12 14:37 ` Peter Xu 0 siblings, 0 replies; 6+ messages in thread From: Peter Xu @ 2025-06-12 14:37 UTC (permalink / raw) To: Daniel P. Berrangé Cc: Jaehoon Kim, qemu-devel, jjherne, steven.sistare, farosas, lvivier, pbonzini On Thu, Jun 12, 2025 at 02:41:15PM +0100, Daniel P. Berrangé wrote: > On Wed, Jun 11, 2025 at 03:56:10PM -0500, Jaehoon Kim wrote: > > Extend cpr_transfer_input to handle SOCKET_ADDRESS_TYPE_FD alongside > > SOCKET_ADDRESS_TYPE_UNIX. This change supports the use of pre-listened > > socket file descriptors for cpr migration channels. > > > > This change is particularly useful in qtest environments, where the > > socket may be created externally and passed via fd. > > > > Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com> > > Reviewed-by: Steve Sistare <steven.sistare@oracle.com> > > Signed-off-by: Jaehoon Kim <jhkim@linux.ibm.com> > > --- > > migration/cpr-transfer.c | 7 +++++-- > > 1 file changed, 5 insertions(+), 2 deletions(-) > > This patch *MUST* be first in the series, otherwise 'git bisect' > will hit test failures on the former patch. Yes. I fixed both issues and queued the series, thanks all. For the other patch I did null-initialize for the var. https://gitlab.com/peterx/qemu/-/commits/migration-staging -- Peter Xu ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-06-12 14:38 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-11 20:56 [PATCH v4 0/2] migration: Support socket fd for CPR and fix Jaehoon Kim 2025-06-11 20:56 ` [PATCH v4 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Jaehoon Kim 2025-06-12 13:33 ` Steven Sistare 2025-06-11 20:56 ` [PATCH v4 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim 2025-06-12 13:41 ` Daniel P. Berrangé 2025-06-12 14:37 ` Peter Xu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).