* [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition.
@ 2025-06-10 22:33 Jaehoon Kim
2025-06-10 22:33 ` [PATCH v3 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim
2025-06-11 12:08 ` [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Fabiano Rosas
0 siblings, 2 replies; 6+ messages in thread
From: Jaehoon Kim @ 2025-06-10 22:33 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..145860c24c 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=%s %s",
+ g_strdup_printf("%d", 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 v3 2/2] migration: Support fd-based socket address in cpr_transfer_input
2025-06-10 22:33 [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Jaehoon Kim
@ 2025-06-10 22:33 ` Jaehoon Kim
2025-06-11 12:28 ` Steven Sistare
2025-06-11 12:08 ` [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Fabiano Rosas
1 sibling, 1 reply; 6+ messages in thread
From: Jaehoon Kim @ 2025-06-10 22:33 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>
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 v3 2/2] migration: Support fd-based socket address in cpr_transfer_input
2025-06-10 22:33 ` [PATCH v3 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim
@ 2025-06-11 12:28 ` Steven Sistare
2025-06-11 20:59 ` JAEHOON KIM
0 siblings, 1 reply; 6+ messages in thread
From: Steven Sistare @ 2025-06-11 12:28 UTC (permalink / raw)
To: Jaehoon Kim, qemu-devel; +Cc: jjherne, peterx, farosas, lvivier, pbonzini
On 6/10/2025 6:33 PM, 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>
> 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);
Reviewed-by: Steve Sistare <steven.sistare@oracle.com>
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v3 2/2] migration: Support fd-based socket address in cpr_transfer_input
2025-06-11 12:28 ` Steven Sistare
@ 2025-06-11 20:59 ` JAEHOON KIM
0 siblings, 0 replies; 6+ messages in thread
From: JAEHOON KIM @ 2025-06-11 20:59 UTC (permalink / raw)
To: Steven Sistare, qemu-devel; +Cc: jjherne, peterx, farosas, lvivier, pbonzini
On 6/11/2025 7:28 AM, Steven Sistare wrote:
> On 6/10/2025 6:33 PM, 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>
>> 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);
>
>
> Reviewed-by: Steve Sistare <steven.sistare@oracle.com>
>
Thank you for your review.
I have addressed your comment in patch 1 by using `%d` directly in
`g_strdup_printf`, as suggested.
Patch 2 remains unchanged, with only your Reviewed-by tag added.
I've just sent out v4 of the patch series.
Please let me know if you have any further comments.
-- Jaehoon Kim
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition.
2025-06-10 22:33 [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Jaehoon Kim
2025-06-10 22:33 ` [PATCH v3 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim
@ 2025-06-11 12:08 ` Fabiano Rosas
2025-06-11 12:25 ` Steven Sistare
1 sibling, 1 reply; 6+ messages in thread
From: Fabiano Rosas @ 2025-06-11 12:08 UTC (permalink / raw)
To: Jaehoon Kim, qemu-devel
Cc: jjherne, steven.sistare, peterx, lvivier, pbonzini, Jaehoon Kim
Jaehoon Kim <jhkim@linux.ibm.com> writes:
Hi,
These patches should be the other way around, first add the support,
then add the test.
> 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..145860c24c 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=%s %s",
> + g_strdup_printf("%d", cpr_sockfd), opts);
The sockfd string will leak.
> MigrateCommon args = {
> .start.opts_source = opts,
> .start.opts_target = opts_target,
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition.
2025-06-11 12:08 ` [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Fabiano Rosas
@ 2025-06-11 12:25 ` Steven Sistare
0 siblings, 0 replies; 6+ messages in thread
From: Steven Sistare @ 2025-06-11 12:25 UTC (permalink / raw)
To: Fabiano Rosas, Jaehoon Kim, qemu-devel; +Cc: jjherne, peterx, lvivier, pbonzini
On 6/11/2025 8:08 AM, Fabiano Rosas wrote:
> Jaehoon Kim <jhkim@linux.ibm.com> writes:
>
> Hi,
>
> These patches should be the other way around, first add the support,
> then add the test.
>
>> 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..145860c24c 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=%s %s",
>> + g_strdup_printf("%d", cpr_sockfd), opts);
>
> The sockfd string will leak.
Just use %d in the top-level printf:
opts_target = g_strdup_printf("-incoming cpr,addr.transport=socket,"
"addr.type=fd,addr.str=%d %s",
cpr_sockfd, opts);
- Steve
>
>> MigrateCommon args = {
>> .start.opts_source = opts,
>> .start.opts_target = opts_target,
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-06-11 21:00 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-10 22:33 [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Jaehoon Kim
2025-06-10 22:33 ` [PATCH v3 2/2] migration: Support fd-based socket address in cpr_transfer_input Jaehoon Kim
2025-06-11 12:28 ` Steven Sistare
2025-06-11 20:59 ` JAEHOON KIM
2025-06-11 12:08 ` [PATCH v3 1/2] tests/migration: Setup pre-listened cpr.sock to remove race-condition Fabiano Rosas
2025-06-11 12:25 ` Steven Sistare
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.