* [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
* [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 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
* 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).