* [PATCH v1 01/15] tests/qtest/migration: Move cpr transfer logic into cpr-tests.c
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-19 20:43 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 02/15] tests/qtest/migration: Make file-tests defer by default Fabiano Rosas
` (15 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Xu, Mark Kanda, Ben Chaney, Laurent Vivier, Paolo Bonzini
There's some amount of cpr-transfer logic at precopy_common, which in
retrospect was a bad idea. For just two tests, that's too much code to
be in the common function. Move it to the cpr file. We'll need this
cleanup for subsequent improvements.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/cpr-tests.c | 57 ++++++++++++++++++++++++++++---
tests/qtest/migration/framework.c | 36 +++----------------
tests/qtest/migration/framework.h | 3 --
3 files changed, 56 insertions(+), 40 deletions(-)
diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
index 63ca5f3996..48c98f0089 100644
--- a/tests/qtest/migration/cpr-tests.c
+++ b/tests/qtest/migration/cpr-tests.c
@@ -15,6 +15,9 @@
#include "migration/framework.h"
#include "migration/migration-qmp.h"
#include "migration/migration-util.h"
+#include "qapi/error.h"
+#include "qobject/qjson.h"
+#include "qobject/qlist.h"
static char *tmpfs;
@@ -42,10 +45,56 @@ static void test_mode_reboot(char *name, MigrateCommon *args)
test_file_common(args, true);
}
-static void *test_mode_transfer_start(QTestState *from, QTestState *to)
+static int test_transfer(MigrateCommon *args, const char *cpr_channel,
+ bool incoming_defer)
{
+ QTestState *from, *to;
+ QObject *obj, *out_channels = qobject_from_json(args->connect_channels,
+ &error_abort);
+ QList *channels_list;
+
+ /*
+ * The cpr channel must be included in outgoing channels, but not in
+ * migrate-incoming channels.
+ */
+ channels_list = qobject_to(QList, out_channels);
+ obj = migrate_str_to_channel(cpr_channel);
+ qlist_append(channels_list, obj);
+
+ if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ return -1;
+ }
+
migrate_set_parameter_str(from, "mode", "cpr-transfer");
- return NULL;
+
+ wait_for_serial("src_serial");
+
+ qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}");
+ wait_for_stop(from, get_src());
+ migrate_ensure_converge(from);
+
+ migrate_qmp(from, to, NULL, out_channels, "{}");
+
+ qtest_connect(to);
+ qtest_qmp_handshake(to, NULL);
+ if (incoming_defer) {
+ QObject *in_channels = qobject_from_json(args->connect_channels,
+ &error_abort);
+
+ migrate_incoming_qmp(to, NULL, in_channels, "{}");
+ }
+
+ wait_for_migration_complete(from);
+ wait_for_migration_complete(to);
+
+ qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}");
+
+ wait_for_resume(to, get_dst());
+ wait_for_serial("dest_serial");
+
+ migrate_end(from, to, true);
+
+ return 0;
}
/*
@@ -86,15 +135,13 @@ static void test_mode_transfer_common(MigrateCommon *args, bool incoming_defer)
args->listen_uri = incoming_defer ? "defer" : uri;
args->connect_channels = connect_channels;
- args->cpr_channel = cpr_channel;
- args->start_hook = test_mode_transfer_start;
args->start.opts_source = opts;
args->start.opts_target = opts_target;
args->start.defer_target_connect = true;
args->start.mem_type = MEM_TYPE_MEMFD;
- if (test_precopy_common(args) < 0) {
+ if (test_transfer(args, cpr_channel, incoming_defer) < 0) {
close(cpr_sockfd);
unlink(cpr_path);
}
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index 9f71d51f1e..4ef5e1de83 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -20,7 +20,6 @@
#include "ppc-util.h"
#include "qapi/error.h"
#include "qobject/qjson.h"
-#include "qobject/qlist.h"
#include "qemu/bswap.h"
#include "qemu/module.h"
#include "qemu/option.h"
@@ -833,10 +832,7 @@ int test_precopy_common(MigrateCommon *args)
{
QTestState *from, *to;
void *data_hook = NULL;
- QObject *in_channels = NULL;
- QObject *out_channels = NULL;
-
- g_assert(!args->cpr_channel || args->connect_channels);
+ QObject *channels = NULL;
if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
return -1;
@@ -869,40 +865,16 @@ int test_precopy_common(MigrateCommon *args)
}
}
- /*
- * The cpr channel must be included in outgoing channels, but not in
- * migrate-incoming channels.
- */
if (args->connect_channels) {
- if (args->start.defer_target_connect &&
- !strcmp(args->listen_uri, "defer")) {
- in_channels = qobject_from_json(args->connect_channels,
- &error_abort);
- }
- out_channels = qobject_from_json(args->connect_channels, &error_abort);
-
- if (args->cpr_channel) {
- QList *channels_list = qobject_to(QList, out_channels);
- QObject *obj = migrate_str_to_channel(args->cpr_channel);
-
- qlist_append(channels_list, obj);
- }
+ channels = qobject_from_json(args->connect_channels, &error_abort);
}
if (args->result == MIG_TEST_QMP_ERROR) {
- migrate_qmp_fail(from, args->connect_uri, out_channels, "{}");
+ migrate_qmp_fail(from, args->connect_uri, channels, "{}");
goto finish;
}
- migrate_qmp(from, to, args->connect_uri, out_channels, "{}");
-
- if (args->start.defer_target_connect) {
- qtest_connect(to);
- qtest_qmp_handshake(to, NULL);
- if (!strcmp(args->listen_uri, "defer")) {
- migrate_incoming_qmp(to, args->connect_uri, in_channels, "{}");
- }
- }
+ migrate_qmp(from, to, args->connect_uri, channels, "{}");
if (args->result != MIG_TEST_SUCCEED) {
bool allow_active = args->result == MIG_TEST_FAIL;
diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
index 79604c60f5..13ce84b49e 100644
--- a/tests/qtest/migration/framework.h
+++ b/tests/qtest/migration/framework.h
@@ -180,9 +180,6 @@ typedef struct {
*/
const char *connect_channels;
- /* Optional: the cpr migration channel, in JSON or dotted keys format */
- const char *cpr_channel;
-
/* Optional: callback to run at start to set migration parameters */
TestMigrateStartHook start_hook;
/* Optional: callback to run at finish to cleanup */
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* Re: [PATCH v1 01/15] tests/qtest/migration: Move cpr transfer logic into cpr-tests.c
2026-05-05 16:09 ` [PATCH v1 01/15] tests/qtest/migration: Move cpr transfer logic into cpr-tests.c Fabiano Rosas
@ 2026-05-19 20:43 ` Peter Xu
0 siblings, 0 replies; 39+ messages in thread
From: Peter Xu @ 2026-05-19 20:43 UTC (permalink / raw)
To: Fabiano Rosas
Cc: qemu-devel, Mark Kanda, Ben Chaney, Laurent Vivier, Paolo Bonzini
On Tue, May 05, 2026 at 01:09:00PM -0300, Fabiano Rosas wrote:
> There's some amount of cpr-transfer logic at precopy_common, which in
> retrospect was a bad idea. For just two tests, that's too much code to
> be in the common function. Move it to the cpr file. We'll need this
> cleanup for subsequent improvements.
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Peter Xu <peterx@redhat.com>
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH v1 02/15] tests/qtest/migration: Make file-tests defer by default
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
2026-05-05 16:09 ` [PATCH v1 01/15] tests/qtest/migration: Move cpr transfer logic into cpr-tests.c Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-19 20:45 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 03/15] tests/qtest/migration: Set file URI " Fabiano Rosas
` (14 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Xu, Mark Kanda, Ben Chaney, Laurent Vivier, Paolo Bonzini
All file: tests use listen_uri="defer". Make this the default in the
common function.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/cpr-tests.c | 1 -
tests/qtest/migration/file-tests.c | 14 --------------
tests/qtest/migration/framework.c | 2 +-
3 files changed, 1 insertion(+), 16 deletions(-)
diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
index 48c98f0089..18217f0460 100644
--- a/tests/qtest/migration/cpr-tests.c
+++ b/tests/qtest/migration/cpr-tests.c
@@ -36,7 +36,6 @@ static void test_mode_reboot(char *name, MigrateCommon *args)
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_mode_reboot;
args->start.mem_type = MEM_TYPE_SHMEM;
diff --git a/tests/qtest/migration/file-tests.c b/tests/qtest/migration/file-tests.c
index fef172068f..75135447f8 100644
--- a/tests/qtest/migration/file-tests.c
+++ b/tests/qtest/migration/file-tests.c
@@ -70,8 +70,6 @@ static void test_precopy_file(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
-
test_file_common(args, true);
}
@@ -114,7 +112,6 @@ static void test_precopy_file_offset_fdset(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:/dev/fdset/1,offset=%d",
FILE_TEST_OFFSET);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_file_offset_fdset;
test_file_common(args, false);
@@ -128,8 +125,6 @@ static void test_precopy_file_offset(char *name, MigrateCommon *args)
FILE_TEST_OFFSET);
args->connect_uri = uri;
- args->listen_uri = "defer";
-
test_file_common(args, false);
}
@@ -140,7 +135,6 @@ static void test_precopy_file_offset_bad(char *name, MigrateCommon *args)
tmpfs, FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->result = MIG_TEST_QMP_ERROR;
test_file_common(args, false);
@@ -152,7 +146,6 @@ static void test_precopy_file_mapped_ram_live(char *name, MigrateCommon *args)
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -165,7 +158,6 @@ static void test_precopy_file_mapped_ram(char *name, MigrateCommon *args)
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -177,7 +169,6 @@ static void test_multifd_file_mapped_ram_live(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -191,7 +182,6 @@ static void test_multifd_file_mapped_ram(char *name, MigrateCommon *args)
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -213,7 +203,6 @@ static void test_multifd_file_mapped_ram_dio(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_mapped_ram_dio;
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -285,7 +274,6 @@ static void test_multifd_file_mapped_ram_fdset(char *name, MigrateCommon *args)
FILE_TEST_OFFSET);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_mapped_ram_fdset;
args->end_hook = migrate_hook_end_multifd_mapped_ram_fdset;
@@ -301,7 +289,6 @@ static void test_multifd_file_mapped_ram_fdset_dio(char *name,
g_autofree char *uri = g_strdup_printf("file:/dev/fdset/1,offset=%d",
FILE_TEST_OFFSET);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_mapped_ram_fdset_dio;
args->end_hook = migrate_hook_end_multifd_mapped_ram_fdset;
@@ -332,7 +319,6 @@ test_precopy_file_mapped_ram_ignore_shared(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
args->connect_uri = uri;
- args->listen_uri = "defer";
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
args->start.caps[MIGRATION_CAPABILITY_X_IGNORE_SHARED] = true;
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index 4ef5e1de83..edd3d0b165 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -972,7 +972,7 @@ void test_file_common(MigrateCommon *args, bool stop_src)
void *data_hook = NULL;
bool check_offset = false;
- if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 03/15] tests/qtest/migration: Set file URI by default
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
2026-05-05 16:09 ` [PATCH v1 01/15] tests/qtest/migration: Move cpr transfer logic into cpr-tests.c Fabiano Rosas
2026-05-05 16:09 ` [PATCH v1 02/15] tests/qtest/migration: Make file-tests defer by default Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-19 20:46 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 04/15] tests/qtest/migration: Group unix migration tests Fabiano Rosas
` (13 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Most file: tests use the same URI. Make it a default in the common
function.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/file-tests.c | 29 -----------------------------
tests/qtest/migration/framework.c | 6 ++++++
2 files changed, 6 insertions(+), 29 deletions(-)
diff --git a/tests/qtest/migration/file-tests.c b/tests/qtest/migration/file-tests.c
index 75135447f8..4b6a2eeb7b 100644
--- a/tests/qtest/migration/file-tests.c
+++ b/tests/qtest/migration/file-tests.c
@@ -67,9 +67,6 @@ static void test_file_connect_outgoing_fd_leak(char *name, MigrateCommon *args)
static void test_precopy_file(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
- FILE_TEST_FILENAME);
- args->connect_uri = uri;
test_file_common(args, true);
}
@@ -142,11 +139,6 @@ static void test_precopy_file_offset_bad(char *name, MigrateCommon *args)
static void test_precopy_file_mapped_ram_live(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
- FILE_TEST_FILENAME);
-
- args->connect_uri = uri;
-
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
test_file_common(args, false);
@@ -154,11 +146,6 @@ static void test_precopy_file_mapped_ram_live(char *name, MigrateCommon *args)
static void test_precopy_file_mapped_ram(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
- FILE_TEST_FILENAME);
-
- args->connect_uri = uri;
-
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
test_file_common(args, true);
@@ -166,10 +153,6 @@ static void test_precopy_file_mapped_ram(char *name, MigrateCommon *args)
static void test_multifd_file_mapped_ram_live(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
- FILE_TEST_FILENAME);
- args->connect_uri = uri;
-
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -178,11 +161,6 @@ static void test_multifd_file_mapped_ram_live(char *name, MigrateCommon *args)
static void test_multifd_file_mapped_ram(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
- FILE_TEST_FILENAME);
-
- args->connect_uri = uri;
-
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -200,9 +178,6 @@ static void *migrate_hook_start_multifd_mapped_ram_dio(QTestState *from,
static void test_multifd_file_mapped_ram_dio(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
- FILE_TEST_FILENAME);
- args->connect_uri = uri;
args->start_hook = migrate_hook_start_multifd_mapped_ram_dio;
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
@@ -316,10 +291,6 @@ static void migration_test_add_file_smoke(MigrationTestEnv *env)
static void
test_precopy_file_mapped_ram_ignore_shared(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
- FILE_TEST_FILENAME);
- args->connect_uri = uri;
-
args->start.caps[MIGRATION_CAPABILITY_MAPPED_RAM] = true;
args->start.caps[MIGRATION_CAPABILITY_X_IGNORE_SHARED] = true;
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index edd3d0b165..42f565af7b 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -971,11 +971,17 @@ void test_file_common(MigrateCommon *args, bool stop_src)
QTestState *from, *to;
void *data_hook = NULL;
bool check_offset = false;
+ g_autofree char *uri = NULL;
if (migrate_start(&from, &to, "defer", &args->start)) {
return;
}
+ if (!args->connect_uri) {
+ uri = g_strdup_printf("file:%s/%s", tmpfs, FILE_TEST_FILENAME);
+ args->connect_uri = uri;
+ }
+
/*
* File migration is never live. We can keep the source VM running
* during migration, but the destination will not be running
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 04/15] tests/qtest/migration: Group unix migration tests
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (2 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 03/15] tests/qtest/migration: Set file URI " Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-19 20:47 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 05/15] tests/qtest/migration: Use precopy_unix_common for ignore-shared test Fabiano Rosas
` (12 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Remove some repetition when defining unix: tests by introducing a
_common function.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/compression-tests.c | 6 +----
tests/qtest/migration/framework.c | 9 +++++++
tests/qtest/migration/framework.h | 1 +
tests/qtest/migration/precopy-tests.c | 30 +++--------------------
tests/qtest/migration/tls-tests.c | 12 ++-------
5 files changed, 17 insertions(+), 41 deletions(-)
diff --git a/tests/qtest/migration/compression-tests.c b/tests/qtest/migration/compression-tests.c
index 845e622cd5..7f2856b7f8 100644
--- a/tests/qtest/migration/compression-tests.c
+++ b/tests/qtest/migration/compression-tests.c
@@ -123,10 +123,6 @@ migrate_hook_start_xbzrle(QTestState *from,
static void test_precopy_unix_xbzrle(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
-
- args->connect_uri = uri;
- args->listen_uri = uri;
args->start_hook = migrate_hook_start_xbzrle;
args->iterations = 2;
/*
@@ -137,7 +133,7 @@ static void test_precopy_unix_xbzrle(char *name, MigrateCommon *args)
args->start.caps[MIGRATION_CAPABILITY_XBZRLE] = true;
- test_precopy_common(args);
+ test_precopy_unix_common(args);
}
static void *
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index 42f565af7b..73bb015f64 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -934,6 +934,15 @@ finish:
return 0;
}
+void test_precopy_unix_common(MigrateCommon *args)
+{
+ g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
+
+ args->listen_uri = uri;
+ args->connect_uri = uri;
+ test_precopy_common(args);
+}
+
static void file_dirty_offset_region(void)
{
g_autofree char *path = g_strdup_printf("%s/%s", tmpfs, FILE_TEST_FILENAME);
diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
index 13ce84b49e..613839dec8 100644
--- a/tests/qtest/migration/framework.h
+++ b/tests/qtest/migration/framework.h
@@ -239,6 +239,7 @@ void test_postcopy_common(MigrateCommon *args);
void test_postcopy_recovery_common(MigrateCommon *args,
PostcopyRecoveryFailStage fail_stage);
int test_precopy_common(MigrateCommon *args);
+void test_precopy_unix_common(MigrateCommon *args);
void test_file_common(MigrateCommon *args, bool stop_src);
void *migrate_hook_start_precopy_tcp_multifd_common(QTestState *from,
QTestState *to,
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index a0e3ff0547..54e45e2a02 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -37,62 +37,40 @@ static char *tmpfs;
static void test_precopy_unix_plain(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
-
- args->listen_uri = uri;
- args->connect_uri = uri;
/*
* The simplest use case of precopy, covering smoke tests of
* get-dirty-log dirty tracking.
*/
args->live = true;
-
- test_precopy_common(args);
+ test_precopy_unix_common(args);
}
static void test_precopy_unix_suspend_live(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
-
- args->listen_uri = uri;
- args->connect_uri = uri;
/*
* despite being live, the test is fast because the src
* suspends immediately.
*/
args->live = true;
-
args->start.suspend_me = true;
-
- test_precopy_common(args);
+ test_precopy_unix_common(args);
}
static void test_precopy_unix_suspend_notlive(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
-
- args->listen_uri = uri;
- args->connect_uri = uri;
args->start.suspend_me = true;
-
- test_precopy_common(args);
+ test_precopy_unix_common(args);
}
static void test_precopy_unix_dirty_ring(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
-
- args->listen_uri = uri;
- args->connect_uri = uri;
/*
* Besides the precopy/unix basic test, cover dirty ring interface
* rather than get-dirty-log.
*/
args->live = true;
-
args->start.use_dirty_ring = true;
-
- test_precopy_common(args);
+ test_precopy_unix_common(args);
}
#ifdef CONFIG_RDMA
diff --git a/tests/qtest/migration/tls-tests.c b/tests/qtest/migration/tls-tests.c
index 87898af260..0677ca661e 100644
--- a/tests/qtest/migration/tls-tests.c
+++ b/tests/qtest/migration/tls-tests.c
@@ -424,14 +424,10 @@ static void test_multifd_postcopy_preempt_recovery_tls_psk(char *name,
static void test_precopy_unix_tls_psk(char *name, MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
-
- args->connect_uri = uri;
- args->listen_uri = uri;
args->start_hook = migrate_hook_start_tls_psk_match;
args->end_hook = migrate_hook_end_tls_psk;
- test_precopy_common(args);
+ test_precopy_unix_common(args);
}
#ifdef CONFIG_TASN1
@@ -454,14 +450,10 @@ static void test_precopy_unix_tls_x509_default_host(char *name,
static void test_precopy_unix_tls_x509_override_host(char *name,
MigrateCommon *args)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
-
- args->connect_uri = uri;
- args->listen_uri = uri;
args->start_hook = migrate_hook_start_tls_x509_override_host;
args->end_hook = migrate_hook_end_tls_x509;
- test_precopy_common(args);
+ test_precopy_unix_common(args);
}
#endif /* CONFIG_TASN1 */
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 05/15] tests/qtest/migration: Use precopy_unix_common for ignore-shared test
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (3 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 04/15] tests/qtest/migration: Group unix migration tests Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 16:06 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 06/15] tests/qtest/migration: Use a default TCP URI for precopy Fabiano Rosas
` (11 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
The ignore-shared test has the same code as the precopy_common test
but inverting (probably incorrectly) the order of a few event
waits. Change it to use the common code instead.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/misc-tests.c | 40 ++++++++----------------------
1 file changed, 11 insertions(+), 29 deletions(-)
diff --git a/tests/qtest/migration/misc-tests.c b/tests/qtest/migration/misc-tests.c
index e114ac5972..8d1cd44183 100644
--- a/tests/qtest/migration/misc-tests.c
+++ b/tests/qtest/migration/misc-tests.c
@@ -90,40 +90,22 @@ static void test_analyze_script(char *name, MigrateCommon *args)
}
#endif
-static void test_ignore_shared(char *name, MigrateCommon *args)
+static void ignore_shared_assert_skipped(QTestState *from, QTestState *to,
+ void *data)
{
- g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
- QTestState *from, *to;
-
- args->start.mem_type = MEM_TYPE_SHMEM;
- args->start.caps[MIGRATION_CAPABILITY_X_IGNORE_SHARED] = true;
-
- if (migrate_start(&from, &to, uri, &args->start)) {
- return;
- }
-
- migrate_ensure_non_converge(from);
- migrate_prepare_for_dirty_mem(from);
-
- /* Wait for the first serial output from the source */
- wait_for_serial("src_serial");
-
- migrate_qmp(from, to, uri, NULL, "{}");
-
- migrate_wait_for_dirty_mem(from, to);
-
- wait_for_stop(from, get_src());
-
- qtest_qmp_eventwait(to, "RESUME");
-
- wait_for_serial("dest_serial");
- wait_for_migration_complete(from);
-
/* Check whether shared RAM has been really skipped */
g_assert_cmpint(
read_ram_property_int(from, "transferred"), <, 4 * 1024 * 1024);
+}
- migrate_end(from, to, true);
+static void test_ignore_shared(char *name, MigrateCommon *args)
+{
+ args->live = true;
+ args->start.mem_type = MEM_TYPE_SHMEM;
+ args->start.caps[MIGRATION_CAPABILITY_X_IGNORE_SHARED] = true;
+ args->end_hook = ignore_shared_assert_skipped;
+
+ test_precopy_unix_common(args);
}
static void do_test_validate_uuid(MigrateStart *args, bool should_fail)
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 06/15] tests/qtest/migration: Use a default TCP URI for precopy
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (4 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 05/15] tests/qtest/migration: Use precopy_unix_common for ignore-shared test Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 16:07 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 07/15] tests/qtest/migration: Defer by default in precopy_common Fabiano Rosas
` (10 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Using a localhost TCP URI for testing is quite common. Set it as a
default for precopy tests that don't provide an URI.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/framework.c | 4 ++++
tests/qtest/migration/precopy-tests.c | 3 ---
tests/qtest/migration/tls-tests.c | 9 ---------
3 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index 73bb015f64..b77889de7f 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -834,6 +834,10 @@ int test_precopy_common(MigrateCommon *args)
void *data_hook = NULL;
QObject *channels = NULL;
+ if (!args->listen_uri) {
+ args->listen_uri = "tcp:127.0.0.1:0";
+ }
+
if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
return -1;
}
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index 54e45e2a02..0d538bcd1a 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -180,14 +180,11 @@ static void test_precopy_rdma_plain_ipv6(char *name, MigrateCommon *args)
static void test_precopy_tcp_plain(char *name, MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
-
test_precopy_common(args);
}
static void test_precopy_tcp_switchover_ack(char *name, MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
/*
* Source VM must be running in order to consider the switchover ACK
* when deciding to do switchover or not.
diff --git a/tests/qtest/migration/tls-tests.c b/tests/qtest/migration/tls-tests.c
index 0677ca661e..4a3c404349 100644
--- a/tests/qtest/migration/tls-tests.c
+++ b/tests/qtest/migration/tls-tests.c
@@ -459,7 +459,6 @@ static void test_precopy_unix_tls_x509_override_host(char *name,
static void test_precopy_tcp_tls_psk_match(char *name, MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_psk_match;
args->end_hook = migrate_hook_end_tls_psk;
@@ -468,7 +467,6 @@ static void test_precopy_tcp_tls_psk_match(char *name, MigrateCommon *args)
static void test_precopy_tcp_tls_psk_mismatch(char *name, MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_psk_mismatch;
args->end_hook = migrate_hook_end_tls_psk;
args->result = MIG_TEST_FAIL;
@@ -488,7 +486,6 @@ static void *migrate_hook_start_no_tls(QTestState *from, QTestState *to)
static void test_precopy_tcp_no_tls(char *name, MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_no_tls;
/* the no_tls start hook requires no cleanup actions */
args->end_hook = NULL;
@@ -529,7 +526,6 @@ static void test_precopy_tcp_tls_no_hostname(char *name, MigrateCommon *args)
static void test_precopy_tcp_tls_x509_default_host(char *name,
MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_default_host;
args->end_hook = migrate_hook_end_tls_x509;
@@ -539,7 +535,6 @@ static void test_precopy_tcp_tls_x509_default_host(char *name,
static void test_precopy_tcp_tls_x509_override_host(char *name,
MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_override_host;
args->end_hook = migrate_hook_end_tls_x509;
@@ -563,7 +558,6 @@ static void test_precopy_tcp_tls_x509_mismatch_host(char *name,
static void test_precopy_tcp_tls_x509_friendly_client(char *name,
MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_friendly_client;
args->end_hook = migrate_hook_end_tls_x509;
@@ -573,7 +567,6 @@ static void test_precopy_tcp_tls_x509_friendly_client(char *name,
static void test_precopy_tcp_tls_x509_hostile_client(char *name,
MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_hostile_client;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
@@ -586,7 +579,6 @@ static void test_precopy_tcp_tls_x509_hostile_client(char *name,
static void test_precopy_tcp_tls_x509_allow_anon_client(char *name,
MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_allow_anon_client;
args->end_hook = migrate_hook_end_tls_x509;
@@ -596,7 +588,6 @@ static void test_precopy_tcp_tls_x509_allow_anon_client(char *name,
static void test_precopy_tcp_tls_x509_reject_anon_client(char *name,
MigrateCommon *args)
{
- args->listen_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_reject_anon_client;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 07/15] tests/qtest/migration: Defer by default in precopy_common
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (5 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 06/15] tests/qtest/migration: Use a default TCP URI for precopy Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-12 14:27 ` Lukas Straub
2026-05-20 16:14 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 08/15] tests/qtest/migration: Set compression method in compression-tests Fabiano Rosas
` (9 subsequent siblings)
16 siblings, 2 replies; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Lukas Straub, Laurent Vivier, Paolo Bonzini
As a design direction, we're restricting the usage of the command line
option -incoming <URI>. The alternative -incoming defer should be used
instead.
Make all precopy_common tests defer by default.
Using the defer option means that QEMU will not start the incoming
migration automatically. Add the incoming QMP command. With the added
command, the invocation at the multifd_common hook becomes redundant,
so remove it.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/colo-tests.c | 12 ++++--------
tests/qtest/migration/compression-tests.c | 6 ------
tests/qtest/migration/framework.c | 15 ++++++++-------
tests/qtest/migration/precopy-tests.c | 11 +----------
tests/qtest/migration/tls-tests.c | 15 +--------------
5 files changed, 14 insertions(+), 45 deletions(-)
diff --git a/tests/qtest/migration/colo-tests.c b/tests/qtest/migration/colo-tests.c
index ef880f5114..4add4a014b 100644
--- a/tests/qtest/migration/colo-tests.c
+++ b/tests/qtest/migration/colo-tests.c
@@ -45,7 +45,7 @@ static int test_colo_common(MigrateCommon *args,
args->start.caps[MIGRATION_CAPABILITY_RETURN_PATH] = true;
args->start.caps[MIGRATION_CAPABILITY_X_COLO] = true;
- if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return -1;
}
@@ -55,6 +55,8 @@ static int test_colo_common(MigrateCommon *args,
data_hook = args->start_hook(from, to);
}
+ migrate_incoming_qmp(to, args->listen_uri, NULL, "{}");
+
migrate_ensure_converge(from);
wait_for_serial("src_serial");
@@ -107,17 +109,11 @@ static void test_colo_plain_common(MigrateCommon *args,
test_colo_common(args, failover_during_checkpoint, primary_failover);
}
-static void *hook_start_multifd(QTestState *from, QTestState *to)
-{
- return migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
-}
-
static void test_colo_multifd_common(MigrateCommon *args,
bool failover_during_checkpoint,
bool primary_failover)
{
- args->listen_uri = "defer";
- args->start_hook = hook_start_multifd;
+ args->listen_uri = "tcp:127.0.0.1:0";
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
test_colo_common(args, failover_during_checkpoint, primary_failover);
}
diff --git a/tests/qtest/migration/compression-tests.c b/tests/qtest/migration/compression-tests.c
index 7f2856b7f8..134bf44db6 100644
--- a/tests/qtest/migration/compression-tests.c
+++ b/tests/qtest/migration/compression-tests.c
@@ -33,7 +33,6 @@ migrate_hook_start_precopy_tcp_multifd_zstd(QTestState *from,
static void test_multifd_tcp_zstd(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_zstd;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -43,7 +42,6 @@ static void test_multifd_tcp_zstd(char *name, MigrateCommon *args)
static void test_multifd_postcopy_tcp_zstd(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_zstd,
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -66,7 +64,6 @@ migrate_hook_start_precopy_tcp_multifd_qatzip(QTestState *from,
static void test_multifd_tcp_qatzip(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_qatzip;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -85,7 +82,6 @@ migrate_hook_start_precopy_tcp_multifd_qpl(QTestState *from,
static void test_multifd_tcp_qpl(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_qpl;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -104,7 +100,6 @@ migrate_hook_start_precopy_tcp_multifd_uadk(QTestState *from,
static void test_multifd_tcp_uadk(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_uadk;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -152,7 +147,6 @@ migrate_hook_start_precopy_tcp_multifd_zlib(QTestState *from,
static void test_multifd_tcp_zlib(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_zlib;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index b77889de7f..f9f16faee4 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -834,11 +834,15 @@ int test_precopy_common(MigrateCommon *args)
void *data_hook = NULL;
QObject *channels = NULL;
- if (!args->listen_uri) {
+ assert(!args->connect_uri);
+
+ if (args->listen_uri) {
+ args->connect_uri = args->listen_uri;
+ } else {
args->listen_uri = "tcp:127.0.0.1:0";
}
- if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return -1;
}
@@ -846,6 +850,8 @@ int test_precopy_common(MigrateCommon *args)
data_hook = args->start_hook(from, to);
}
+ migrate_incoming_qmp(to, args->listen_uri, NULL, "{}");
+
/* Wait for the first serial output from the source */
if (args->result == MIG_TEST_SUCCEED) {
wait_for_serial("src_serial");
@@ -943,7 +949,6 @@ void test_precopy_unix_common(MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
args->listen_uri = uri;
- args->connect_uri = uri;
test_precopy_common(args);
}
@@ -1064,10 +1069,6 @@ void *migrate_hook_start_precopy_tcp_multifd_common(QTestState *from,
{
migrate_set_parameter_str(from, "multifd-compression", method);
migrate_set_parameter_str(to, "multifd-compression", method);
-
- /* Start incoming migration from the 1st socket */
- migrate_incoming_qmp(to, "tcp:127.0.0.1:0", NULL, "{}");
-
return NULL;
}
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index 0d538bcd1a..05e5bee48d 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -162,7 +162,6 @@ static void __test_precopy_rdma_plain(MigrateCommon *args, bool ipv6)
g_autofree char *uri = g_strdup_printf("rdma:%s:29200", buffer);
args->listen_uri = uri;
- args->connect_uri = uri;
test_precopy_common(args);
}
@@ -214,9 +213,6 @@ static void *migrate_hook_start_fd(QTestState *from,
" 'arguments': { 'fdname': 'fd-mig' }}");
close(pair[0]);
- /* Start incoming migration from the 1st socket */
- migrate_incoming_qmp(to, "fd:fd-mig", NULL, "{}");
-
/* Send the 2nd socket to the target */
qtest_qmp_fds_assert_success(from, &pair[1], 1,
"{ 'execute': 'getfd',"
@@ -257,8 +253,7 @@ static void migrate_hook_end_fd(QTestState *from,
static void test_precopy_fd_socket(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
- args->connect_uri = "fd:fd-mig";
+ args->listen_uri = "fd:fd-mig";
args->start_hook = migrate_hook_start_fd;
args->end_hook = migrate_hook_end_fd;
@@ -410,7 +405,6 @@ migrate_hook_start_precopy_tcp_multifd_no_zero_page(QTestState *from,
static void test_multifd_tcp_uri_none(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd;
/*
* Multifd is more complicated than most of the features, it
@@ -426,7 +420,6 @@ static void test_multifd_tcp_uri_none(char *name, MigrateCommon *args)
static void test_multifd_tcp_zero_page_legacy(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_zero_page_legacy;
/*
* Multifd is more complicated than most of the features, it
@@ -442,7 +435,6 @@ static void test_multifd_tcp_zero_page_legacy(char *name, MigrateCommon *args)
static void test_multifd_tcp_no_zero_page(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd_no_zero_page;
/*
* Multifd is more complicated than most of the features, it
@@ -458,7 +450,6 @@ static void test_multifd_tcp_no_zero_page(char *name, MigrateCommon *args)
static void test_multifd_tcp_channels_none(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_precopy_tcp_multifd;
args->live = true;
args->connect_channels = ("[ { 'channel-type': 'main',"
diff --git a/tests/qtest/migration/tls-tests.c b/tests/qtest/migration/tls-tests.c
index 4a3c404349..275d0b84d4 100644
--- a/tests/qtest/migration/tls-tests.c
+++ b/tests/qtest/migration/tls-tests.c
@@ -436,8 +436,7 @@ static void test_precopy_unix_tls_x509_default_host(char *name,
{
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
- args->connect_uri = uri;
- args->listen_uri = "defer";
+ args->listen_uri = uri;
args->start_hook = migrate_hook_start_tls_x509_default_host;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
@@ -511,8 +510,6 @@ migrate_hook_start_tls_x509_no_host(QTestState *from, QTestState *to)
static void test_precopy_tcp_tls_no_hostname(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
- args->connect_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_no_host;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
@@ -544,8 +541,6 @@ static void test_precopy_tcp_tls_x509_override_host(char *name,
static void test_precopy_tcp_tls_x509_mismatch_host(char *name,
MigrateCommon *args)
{
- args->listen_uri = "defer";
- args->connect_uri = "tcp:127.0.0.1:0";
args->start_hook = migrate_hook_start_tls_x509_mismatch_host;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
@@ -658,7 +653,6 @@ migrate_hook_start_multifd_tls_x509_reject_anon_client(QTestState *from,
static void test_multifd_tcp_tls_psk_match(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tcp_tls_psk_match;
args->end_hook = migrate_hook_end_tls_psk;
@@ -669,7 +663,6 @@ static void test_multifd_tcp_tls_psk_match(char *name, MigrateCommon *args)
static void test_multifd_tcp_tls_psk_mismatch(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tcp_tls_psk_mismatch;
args->end_hook = migrate_hook_end_tls_psk;
args->result = MIG_TEST_FAIL;
@@ -683,7 +676,6 @@ static void test_multifd_tcp_tls_psk_mismatch(char *name, MigrateCommon *args)
static void test_multifd_postcopy_tcp_tls_psk_match(char *name,
MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tcp_tls_psk_match;
args->end_hook = migrate_hook_end_tls_psk;
@@ -697,7 +689,6 @@ static void test_multifd_postcopy_tcp_tls_psk_match(char *name,
static void test_multifd_tcp_tls_x509_default_host(char *name,
MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tls_x509_default_host;
args->end_hook = migrate_hook_end_tls_x509;
@@ -709,7 +700,6 @@ static void test_multifd_tcp_tls_x509_default_host(char *name,
static void test_multifd_tcp_tls_x509_override_host(char *name,
MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tls_x509_override_host;
args->end_hook = migrate_hook_end_tls_x509;
@@ -734,7 +724,6 @@ static void test_multifd_tcp_tls_x509_mismatch_host(char *name,
* to load migration state, and thus just aborts the migration
* without exiting.
*/
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tls_x509_mismatch_host;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
@@ -748,7 +737,6 @@ static void test_multifd_tcp_tls_x509_mismatch_host(char *name,
static void test_multifd_tcp_tls_x509_allow_anon_client(char *name,
MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tls_x509_allow_anon_client;
args->end_hook = migrate_hook_end_tls_x509;
@@ -760,7 +748,6 @@ static void test_multifd_tcp_tls_x509_allow_anon_client(char *name,
static void test_multifd_tcp_tls_x509_reject_anon_client(char *name,
MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start_hook = migrate_hook_start_multifd_tls_x509_reject_anon_client;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* Re: [PATCH v1 07/15] tests/qtest/migration: Defer by default in precopy_common
2026-05-05 16:09 ` [PATCH v1 07/15] tests/qtest/migration: Defer by default in precopy_common Fabiano Rosas
@ 2026-05-12 14:27 ` Lukas Straub
2026-05-20 16:14 ` Peter Xu
1 sibling, 0 replies; 39+ messages in thread
From: Lukas Straub @ 2026-05-12 14:27 UTC (permalink / raw)
To: Fabiano Rosas; +Cc: qemu-devel, Peter Xu, Laurent Vivier, Paolo Bonzini
[-- Attachment #1: Type: text/plain, Size: 1092 bytes --]
On Tue, 5 May 2026 13:09:06 -0300
Fabiano Rosas <farosas@suse.de> wrote:
> As a design direction, we're restricting the usage of the command line
> option -incoming <URI>. The alternative -incoming defer should be used
> instead.
>
> Make all precopy_common tests defer by default.
>
> Using the defer option means that QEMU will not start the incoming
> migration automatically. Add the incoming QMP command. With the added
> command, the invocation at the multifd_common hook becomes redundant,
> so remove it.
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
> tests/qtest/migration/colo-tests.c | 12 ++++--------
> tests/qtest/migration/compression-tests.c | 6 ------
> tests/qtest/migration/framework.c | 15 ++++++++-------
> tests/qtest/migration/precopy-tests.c | 11 +----------
> tests/qtest/migration/tls-tests.c | 15 +--------------
> 5 files changed, 14 insertions(+), 45 deletions(-)
For migration/colo-tests.c:
Reviewed-by: Lukas Straub <lukasstraub2@web.de>
Tested-by: Lukas Straub <lukasstraub2@web.de>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v1 07/15] tests/qtest/migration: Defer by default in precopy_common
2026-05-05 16:09 ` [PATCH v1 07/15] tests/qtest/migration: Defer by default in precopy_common Fabiano Rosas
2026-05-12 14:27 ` Lukas Straub
@ 2026-05-20 16:14 ` Peter Xu
1 sibling, 0 replies; 39+ messages in thread
From: Peter Xu @ 2026-05-20 16:14 UTC (permalink / raw)
To: Fabiano Rosas; +Cc: qemu-devel, Lukas Straub, Laurent Vivier, Paolo Bonzini
On Tue, May 05, 2026 at 01:09:06PM -0300, Fabiano Rosas wrote:
> As a design direction, we're restricting the usage of the command line
> option -incoming <URI>. The alternative -incoming defer should be used
> instead.
>
> Make all precopy_common tests defer by default.
>
> Using the defer option means that QEMU will not start the incoming
> migration automatically. Add the incoming QMP command. With the added
> command, the invocation at the multifd_common hook becomes redundant,
> so remove it.
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Peter Xu <peterx@redhat.com>
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH v1 08/15] tests/qtest/migration: Set compression method in compression-tests
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (6 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 07/15] tests/qtest/migration: Defer by default in precopy_common Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 16:15 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 09/15] tests/qtest/migration: Remove multifd compression hook Fabiano Rosas
` (8 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Stop calling a common function to set the multifd compression
method. The default method is "none", so the common function is not
necessary for tests that don't set compression and will be removed.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/compression-tests.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/tests/qtest/migration/compression-tests.c b/tests/qtest/migration/compression-tests.c
index 134bf44db6..848576054f 100644
--- a/tests/qtest/migration/compression-tests.c
+++ b/tests/qtest/migration/compression-tests.c
@@ -20,6 +20,13 @@
static char *tmpfs;
+static void set_multifd_compression(QTestState *from, QTestState *to,
+ const char *method)
+{
+ migrate_set_parameter_str(from, "multifd-compression", method);
+ migrate_set_parameter_str(to, "multifd-compression", method);
+}
+
#ifdef CONFIG_ZSTD
static void *
migrate_hook_start_precopy_tcp_multifd_zstd(QTestState *from,
@@ -27,8 +34,9 @@ migrate_hook_start_precopy_tcp_multifd_zstd(QTestState *from,
{
migrate_set_parameter_int(from, "multifd-zstd-level", 2);
migrate_set_parameter_int(to, "multifd-zstd-level", 2);
+ set_multifd_compression(from, to, "zstd");
- return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zstd");
+ return NULL;
}
static void test_multifd_tcp_zstd(char *name, MigrateCommon *args)
@@ -58,8 +66,9 @@ migrate_hook_start_precopy_tcp_multifd_qatzip(QTestState *from,
{
migrate_set_parameter_int(from, "multifd-qatzip-level", 2);
migrate_set_parameter_int(to, "multifd-qatzip-level", 2);
+ set_multifd_compression(from, to, "qatzip");
- return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qatzip");
+ return NULL;
}
static void test_multifd_tcp_qatzip(char *name, MigrateCommon *args)
@@ -77,7 +86,8 @@ static void *
migrate_hook_start_precopy_tcp_multifd_qpl(QTestState *from,
QTestState *to)
{
- return migrate_hook_start_precopy_tcp_multifd_common(from, to, "qpl");
+ set_multifd_compression(from, to, "qpl");
+ return NULL;
}
static void test_multifd_tcp_qpl(char *name, MigrateCommon *args)
@@ -95,7 +105,8 @@ static void *
migrate_hook_start_precopy_tcp_multifd_uadk(QTestState *from,
QTestState *to)
{
- return migrate_hook_start_precopy_tcp_multifd_common(from, to, "uadk");
+ set_multifd_compression(from, to, "uadk");
+ return NULL;
}
static void test_multifd_tcp_uadk(char *name, MigrateCommon *args)
@@ -141,8 +152,9 @@ migrate_hook_start_precopy_tcp_multifd_zlib(QTestState *from,
*/
migrate_set_parameter_int(from, "multifd-zlib-level", 2);
migrate_set_parameter_int(to, "multifd-zlib-level", 2);
+ set_multifd_compression(from, to, "zlib");
- return migrate_hook_start_precopy_tcp_multifd_common(from, to, "zlib");
+ return NULL;
}
static void test_multifd_tcp_zlib(char *name, MigrateCommon *args)
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 09/15] tests/qtest/migration: Remove multifd compression hook
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (7 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 08/15] tests/qtest/migration: Set compression method in compression-tests Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 16:16 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 10/15] tests/qtest/migration: Use defer for all tests Fabiano Rosas
` (7 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Take advantage of the default compression method for multifd being
"none" and remove the common compression hook.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/framework.c | 9 ----
tests/qtest/migration/framework.h | 3 --
tests/qtest/migration/precopy-tests.c | 11 ----
tests/qtest/migration/tls-tests.c | 74 +++------------------------
4 files changed, 8 insertions(+), 89 deletions(-)
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index f9f16faee4..9df33f8809 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -1063,15 +1063,6 @@ finish:
migrate_end(from, to, args->result == MIG_TEST_SUCCEED);
}
-void *migrate_hook_start_precopy_tcp_multifd_common(QTestState *from,
- QTestState *to,
- const char *method)
-{
- migrate_set_parameter_str(from, "multifd-compression", method);
- migrate_set_parameter_str(to, "multifd-compression", method);
- return NULL;
-}
-
QTestMigrationState *get_src(void)
{
return &src_state;
diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
index 613839dec8..7635e9fac1 100644
--- a/tests/qtest/migration/framework.h
+++ b/tests/qtest/migration/framework.h
@@ -241,9 +241,6 @@ void test_postcopy_recovery_common(MigrateCommon *args,
int test_precopy_common(MigrateCommon *args);
void test_precopy_unix_common(MigrateCommon *args);
void test_file_common(MigrateCommon *args, bool stop_src);
-void *migrate_hook_start_precopy_tcp_multifd_common(QTestState *from,
- QTestState *to,
- const char *method);
typedef struct QTestMigrationState QTestMigrationState;
QTestMigrationState *get_src(void);
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index 05e5bee48d..45a8f6d76c 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -378,18 +378,10 @@ static void test_auto_converge(char *name, MigrateCommon *args)
migrate_end(from, to, true);
}
-static void *
-migrate_hook_start_precopy_tcp_multifd(QTestState *from,
- QTestState *to)
-{
- return migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
-}
-
static void *
migrate_hook_start_precopy_tcp_multifd_zero_page_legacy(QTestState *from,
QTestState *to)
{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
migrate_set_parameter_str(from, "zero-page-detection", "legacy");
return NULL;
}
@@ -398,14 +390,12 @@ static void *
migrate_hook_start_precopy_tcp_multifd_no_zero_page(QTestState *from,
QTestState *to)
{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
migrate_set_parameter_str(from, "zero-page-detection", "none");
return NULL;
}
static void test_multifd_tcp_uri_none(char *name, MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_precopy_tcp_multifd;
/*
* Multifd is more complicated than most of the features, it
* directly takes guest page buffers when sending, make sure
@@ -450,7 +440,6 @@ static void test_multifd_tcp_no_zero_page(char *name, MigrateCommon *args)
static void test_multifd_tcp_channels_none(char *name, MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_precopy_tcp_multifd;
args->live = true;
args->connect_channels = ("[ { 'channel-type': 'main',"
" 'addr': { 'transport': 'socket',"
diff --git a/tests/qtest/migration/tls-tests.c b/tests/qtest/migration/tls-tests.c
index 275d0b84d4..f45f4c4b0c 100644
--- a/tests/qtest/migration/tls-tests.c
+++ b/tests/qtest/migration/tls-tests.c
@@ -593,67 +593,9 @@ static void test_precopy_tcp_tls_x509_reject_anon_client(char *name,
}
#endif /* CONFIG_TASN1 */
-static void *
-migrate_hook_start_multifd_tcp_tls_psk_match(QTestState *from,
- QTestState *to)
-{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
- return migrate_hook_start_tls_psk_match(from, to);
-}
-
-static void *
-migrate_hook_start_multifd_tcp_tls_psk_mismatch(QTestState *from,
- QTestState *to)
-{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
- return migrate_hook_start_tls_psk_mismatch(from, to);
-}
-
-#ifdef CONFIG_TASN1
-static void *
-migrate_hook_start_multifd_tls_x509_default_host(QTestState *from,
- QTestState *to)
-{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
- return migrate_hook_start_tls_x509_default_host(from, to);
-}
-
-static void *
-migrate_hook_start_multifd_tls_x509_override_host(QTestState *from,
- QTestState *to)
-{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
- return migrate_hook_start_tls_x509_override_host(from, to);
-}
-
-static void *
-migrate_hook_start_multifd_tls_x509_mismatch_host(QTestState *from,
- QTestState *to)
-{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
- return migrate_hook_start_tls_x509_mismatch_host(from, to);
-}
-
-static void *
-migrate_hook_start_multifd_tls_x509_allow_anon_client(QTestState *from,
- QTestState *to)
-{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
- return migrate_hook_start_tls_x509_allow_anon_client(from, to);
-}
-
-static void *
-migrate_hook_start_multifd_tls_x509_reject_anon_client(QTestState *from,
- QTestState *to)
-{
- migrate_hook_start_precopy_tcp_multifd_common(from, to, "none");
- return migrate_hook_start_tls_x509_reject_anon_client(from, to);
-}
-#endif /* CONFIG_TASN1 */
-
static void test_multifd_tcp_tls_psk_match(char *name, MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_multifd_tcp_tls_psk_match;
+ args->start_hook = migrate_hook_start_tls_psk_match;
args->end_hook = migrate_hook_end_tls_psk;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -663,7 +605,7 @@ static void test_multifd_tcp_tls_psk_match(char *name, MigrateCommon *args)
static void test_multifd_tcp_tls_psk_mismatch(char *name, MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_multifd_tcp_tls_psk_mismatch;
+ args->start_hook = migrate_hook_start_tls_psk_mismatch;
args->end_hook = migrate_hook_end_tls_psk;
args->result = MIG_TEST_FAIL;
@@ -676,7 +618,7 @@ static void test_multifd_tcp_tls_psk_mismatch(char *name, MigrateCommon *args)
static void test_multifd_postcopy_tcp_tls_psk_match(char *name,
MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_multifd_tcp_tls_psk_match;
+ args->start_hook = migrate_hook_start_tls_psk_match;
args->end_hook = migrate_hook_end_tls_psk;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -689,7 +631,7 @@ static void test_multifd_postcopy_tcp_tls_psk_match(char *name,
static void test_multifd_tcp_tls_x509_default_host(char *name,
MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_multifd_tls_x509_default_host;
+ args->start_hook = migrate_hook_start_tls_x509_default_host;
args->end_hook = migrate_hook_end_tls_x509;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -700,7 +642,7 @@ static void test_multifd_tcp_tls_x509_default_host(char *name,
static void test_multifd_tcp_tls_x509_override_host(char *name,
MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_multifd_tls_x509_override_host;
+ args->start_hook = migrate_hook_start_tls_x509_override_host;
args->end_hook = migrate_hook_end_tls_x509;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -724,7 +666,7 @@ static void test_multifd_tcp_tls_x509_mismatch_host(char *name,
* to load migration state, and thus just aborts the migration
* without exiting.
*/
- args->start_hook = migrate_hook_start_multifd_tls_x509_mismatch_host;
+ args->start_hook = migrate_hook_start_tls_x509_mismatch_host;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
@@ -737,7 +679,7 @@ static void test_multifd_tcp_tls_x509_mismatch_host(char *name,
static void test_multifd_tcp_tls_x509_allow_anon_client(char *name,
MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_multifd_tls_x509_allow_anon_client;
+ args->start_hook = migrate_hook_start_tls_x509_allow_anon_client;
args->end_hook = migrate_hook_end_tls_x509;
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
@@ -748,7 +690,7 @@ static void test_multifd_tcp_tls_x509_allow_anon_client(char *name,
static void test_multifd_tcp_tls_x509_reject_anon_client(char *name,
MigrateCommon *args)
{
- args->start_hook = migrate_hook_start_multifd_tls_x509_reject_anon_client;
+ args->start_hook = migrate_hook_start_tls_x509_reject_anon_client;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 10/15] tests/qtest/migration: Use defer for all tests
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (8 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 09/15] tests/qtest/migration: Remove multifd compression hook Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 16:20 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 11/15] tests/qtest/migration: Use defer for cpr-tests Fabiano Rosas
` (6 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Change all invocations of migrate_start to use defer. The uri
parameter will be removed from that function in subsequent patches.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/misc-tests.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/tests/qtest/migration/misc-tests.c b/tests/qtest/migration/misc-tests.c
index 8d1cd44183..8216b5d79d 100644
--- a/tests/qtest/migration/misc-tests.c
+++ b/tests/qtest/migration/misc-tests.c
@@ -28,9 +28,11 @@ static void test_baddest(char *name, MigrateCommon *args)
args->start.hide_stderr = true;
- if (migrate_start(&from, &to, "tcp:127.0.0.1:0", &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return;
}
+
+ migrate_incoming_qmp(to, "tcp:127.0.0.1:0", NULL, "{}");
migrate_qmp(from, to, "tcp:127.0.0.1:0", NULL, "{}");
wait_for_migration_fail(from, false);
migrate_end(from, to, false);
@@ -52,8 +54,7 @@ static void test_analyze_script(char *name, MigrateCommon *args)
return;
}
- /* dummy url */
- if (migrate_start(&from, &to, "tcp:127.0.0.1:0", &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return;
}
@@ -69,6 +70,7 @@ static void test_analyze_script(char *name, MigrateCommon *args)
uri = g_strdup_printf("exec:cat > %s", file);
migrate_ensure_converge(from);
+ migrate_incoming_qmp(to, "tcp:127.0.0.1:0", NULL, "{}");
migrate_qmp(from, to, uri, NULL, "{}");
wait_for_migration_complete(from);
@@ -178,13 +180,15 @@ static void do_test_validate_uri_channel(MigrateCommon *args)
QTestState *from, *to;
QObject *channels;
- if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return;
}
/* Wait for the first serial output from the source */
wait_for_serial("src_serial");
+ migrate_incoming_qmp(to, "tcp:127.0.0.1:0", NULL, "{}");
+
/*
* 'uri' and 'channels' validation is checked even before the migration
* starts.
@@ -248,7 +252,6 @@ static void test_validate_caps_pair(char *test_path, MigrateCommon *args)
static void test_validate_uri_channels_both_set(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer",
args->connect_uri = "tcp:127.0.0.1:0",
args->connect_channels = ("[ { ""'channel-type': 'main',"
" 'addr': { 'transport': 'socket',"
@@ -263,7 +266,6 @@ static void test_validate_uri_channels_both_set(char *name, MigrateCommon *args)
static void test_validate_uri_channels_none_set(char *name, MigrateCommon *args)
{
- args->listen_uri = "defer";
args->start.hide_stderr = true;
do_test_validate_uri_channel(args);
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 11/15] tests/qtest/migration: Use defer for cpr-tests
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (9 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 10/15] tests/qtest/migration: Use defer for all tests Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 17:37 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 12/15] tests/qtest/migration: Use defer for auto-converge Fabiano Rosas
` (5 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Xu, Mark Kanda, Ben Chaney, Laurent Vivier, Paolo Bonzini
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/cpr-tests.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
index 18217f0460..9091a84213 100644
--- a/tests/qtest/migration/cpr-tests.c
+++ b/tests/qtest/migration/cpr-tests.c
@@ -60,7 +60,7 @@ static int test_transfer(MigrateCommon *args, const char *cpr_channel,
obj = migrate_str_to_channel(cpr_channel);
qlist_append(channels_list, obj);
- if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return -1;
}
@@ -128,11 +128,17 @@ static void test_mode_transfer_common(MigrateCommon *args, bool incoming_defer)
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);
+ if (incoming_defer) {
+ opts_target = g_strdup_printf("-incoming cpr,addr.transport=socket,"
+ "addr.type=fd,addr.str=%d %s",
+ cpr_sockfd, opts);
+ } else {
+ opts_target = g_strdup_printf("-incoming %s "
+ "-incoming cpr,addr.transport=socket,"
+ "addr.type=fd,addr.str=%d %s",
+ uri, cpr_sockfd, opts);
+ }
- args->listen_uri = incoming_defer ? "defer" : uri;
args->connect_channels = connect_channels;
args->start.opts_source = opts;
@@ -224,7 +230,7 @@ static void test_cpr_exec(MigrateCommon *args)
g_autofree char *filename = g_strdup_printf("%s/%s", tmpfs,
FILE_TEST_FILENAME);
- if (migrate_start(&from, NULL, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, NULL, "defer", &args->start)) {
return;
}
@@ -274,10 +280,7 @@ static void test_mode_exec(char *name, MigrateCommon *args)
{
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
- g_autofree char *listen_uri = g_strdup_printf("defer");
-
args->connect_uri = uri;
- args->listen_uri = listen_uri;
args->start_hook = test_mode_exec_start;
args->start.only_source = true;
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* Re: [PATCH v1 11/15] tests/qtest/migration: Use defer for cpr-tests
2026-05-05 16:09 ` [PATCH v1 11/15] tests/qtest/migration: Use defer for cpr-tests Fabiano Rosas
@ 2026-05-20 17:37 ` Peter Xu
2026-05-22 13:23 ` Fabiano Rosas
0 siblings, 1 reply; 39+ messages in thread
From: Peter Xu @ 2026-05-20 17:37 UTC (permalink / raw)
To: Fabiano Rosas
Cc: qemu-devel, Mark Kanda, Ben Chaney, Laurent Vivier, Paolo Bonzini
On Tue, May 05, 2026 at 01:09:10PM -0300, Fabiano Rosas wrote:
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
> tests/qtest/migration/cpr-tests.c | 21 ++++++++++++---------
Reviewed-by: Peter Xu <peterx@redhat.com>
Only one thing to double check:
> 1 file changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
> index 18217f0460..9091a84213 100644
> --- a/tests/qtest/migration/cpr-tests.c
> +++ b/tests/qtest/migration/cpr-tests.c
> @@ -60,7 +60,7 @@ static int test_transfer(MigrateCommon *args, const char *cpr_channel,
> obj = migrate_str_to_channel(cpr_channel);
> qlist_append(channels_list, obj);
>
> - if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
> + if (migrate_start(&from, &to, "defer", &args->start)) {
> return -1;
> }
>
> @@ -128,11 +128,17 @@ static void test_mode_transfer_common(MigrateCommon *args, bool incoming_defer)
> 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);
> + if (incoming_defer) {
> + opts_target = g_strdup_printf("-incoming cpr,addr.transport=socket,"
> + "addr.type=fd,addr.str=%d %s",
> + cpr_sockfd, opts);
> + } else {
> + opts_target = g_strdup_printf("-incoming %s "
> + "-incoming cpr,addr.transport=socket,"
> + "addr.type=fd,addr.str=%d %s",
> + uri, cpr_sockfd, opts);
IIUC now in this path qtest will ultimately generate cmdline like this for
dest:
-incoming defer \
-incoming unix:... \
-incoming cpr,addr...
I am not sure if this is the intention, but it looks working indeed where
the 1st defer will be an no-op, and "-incoming" allows overwrites.
We'll just need to remember this and be careful in the future on the order
of these parameters. Say, if we accidentally move the first "-incoming
defer" parameter to be after opts_target, then it might break, because then
it's not no-op anymore but freeing the main channel we just set.
But I think it's ok for now.
> + }
>
> - args->listen_uri = incoming_defer ? "defer" : uri;
> args->connect_channels = connect_channels;
>
> args->start.opts_source = opts;
> @@ -224,7 +230,7 @@ static void test_cpr_exec(MigrateCommon *args)
> g_autofree char *filename = g_strdup_printf("%s/%s", tmpfs,
> FILE_TEST_FILENAME);
>
> - if (migrate_start(&from, NULL, args->listen_uri, &args->start)) {
> + if (migrate_start(&from, NULL, "defer", &args->start)) {
> return;
> }
>
> @@ -274,10 +280,7 @@ static void test_mode_exec(char *name, MigrateCommon *args)
> {
> g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
> FILE_TEST_FILENAME);
> - g_autofree char *listen_uri = g_strdup_printf("defer");
> -
> args->connect_uri = uri;
> - args->listen_uri = listen_uri;
> args->start_hook = test_mode_exec_start;
>
> args->start.only_source = true;
> --
> 2.51.0
>
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread* Re: [PATCH v1 11/15] tests/qtest/migration: Use defer for cpr-tests
2026-05-20 17:37 ` Peter Xu
@ 2026-05-22 13:23 ` Fabiano Rosas
0 siblings, 0 replies; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-22 13:23 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Mark Kanda, Ben Chaney, Laurent Vivier, Paolo Bonzini
Peter Xu <peterx@redhat.com> writes:
> On Tue, May 05, 2026 at 01:09:10PM -0300, Fabiano Rosas wrote:
>> Signed-off-by: Fabiano Rosas <farosas@suse.de>
>> ---
>> tests/qtest/migration/cpr-tests.c | 21 ++++++++++++---------
>
> Reviewed-by: Peter Xu <peterx@redhat.com>
>
> Only one thing to double check:
>
>> 1 file changed, 12 insertions(+), 9 deletions(-)
>>
>> diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
>> index 18217f0460..9091a84213 100644
>> --- a/tests/qtest/migration/cpr-tests.c
>> +++ b/tests/qtest/migration/cpr-tests.c
>> @@ -60,7 +60,7 @@ static int test_transfer(MigrateCommon *args, const char *cpr_channel,
>> obj = migrate_str_to_channel(cpr_channel);
>> qlist_append(channels_list, obj);
>>
>> - if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
>> + if (migrate_start(&from, &to, "defer", &args->start)) {
>> return -1;
>> }
>>
>> @@ -128,11 +128,17 @@ static void test_mode_transfer_common(MigrateCommon *args, bool incoming_defer)
>> 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);
>> + if (incoming_defer) {
>> + opts_target = g_strdup_printf("-incoming cpr,addr.transport=socket,"
>> + "addr.type=fd,addr.str=%d %s",
>> + cpr_sockfd, opts);
>> + } else {
>> + opts_target = g_strdup_printf("-incoming %s "
>> + "-incoming cpr,addr.transport=socket,"
>> + "addr.type=fd,addr.str=%d %s",
>> + uri, cpr_sockfd, opts);
>
> IIUC now in this path qtest will ultimately generate cmdline like this for
> dest:
>
> -incoming defer \
> -incoming unix:... \
> -incoming cpr,addr...
>
> I am not sure if this is the intention, but it looks working indeed where
> the 1st defer will be an no-op, and "-incoming" allows overwrites.
>
Yes, it's on purpose, I think I remember some discussion at the time
about this and we decided it was ok.
In any case, it's probably good to have some variability because that
parsing code at vl.c is quite fragile in my opinion. Better to find a
breakage during testing than in production.
> We'll just need to remember this and be careful in the future on the order
> of these parameters. Say, if we accidentally move the first "-incoming
> defer" parameter to be after opts_target, then it might break, because then
> it's not no-op anymore but freeing the main channel we just set.
>
> But I think it's ok for now.
>
>> + }
>>
>> - args->listen_uri = incoming_defer ? "defer" : uri;
>> args->connect_channels = connect_channels;
>>
>> args->start.opts_source = opts;
>> @@ -224,7 +230,7 @@ static void test_cpr_exec(MigrateCommon *args)
>> g_autofree char *filename = g_strdup_printf("%s/%s", tmpfs,
>> FILE_TEST_FILENAME);
>>
>> - if (migrate_start(&from, NULL, args->listen_uri, &args->start)) {
>> + if (migrate_start(&from, NULL, "defer", &args->start)) {
>> return;
>> }
>>
>> @@ -274,10 +280,7 @@ static void test_mode_exec(char *name, MigrateCommon *args)
>> {
>> g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
>> FILE_TEST_FILENAME);
>> - g_autofree char *listen_uri = g_strdup_printf("defer");
>> -
>> args->connect_uri = uri;
>> - args->listen_uri = listen_uri;
>> args->start_hook = test_mode_exec_start;
>>
>> args->start.only_source = true;
>> --
>> 2.51.0
>>
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH v1 12/15] tests/qtest/migration: Use defer for auto-converge
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (10 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 11/15] tests/qtest/migration: Use defer for cpr-tests Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 17:37 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 13/15] tests/qtest/migration: Use defer in dirty_limit test Fabiano Rosas
` (4 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/precopy-tests.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index 45a8f6d76c..67c5b40789 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -291,7 +291,7 @@ static void test_auto_converge(char *name, MigrateCommon *args)
uint64_t prev_dirty_sync_cnt, dirty_sync_cnt;
int max_try_count, hit = 0;
- if (migrate_start(&from, &to, uri, &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return;
}
@@ -312,6 +312,7 @@ static void test_auto_converge(char *name, MigrateCommon *args)
/* Wait for the first serial output from the source */
wait_for_serial("src_serial");
+ migrate_incoming_qmp(to, uri, NULL, "{}");
migrate_qmp(from, to, uri, NULL, "{}");
/* Wait for throttling begins */
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 13/15] tests/qtest/migration: Use defer in dirty_limit test
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (11 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 12/15] tests/qtest/migration: Use defer for auto-converge Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-20 17:37 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 14/15] tests/qtest/migration: Stop passing URI into migrate_start Fabiano Rosas
` (3 subsequent siblings)
16 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Laurent Vivier, Paolo Bonzini
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/precopy-tests.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index 67c5b40789..b13e84e26d 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -1077,11 +1077,12 @@ static void test_dirty_limit(char *name, MigrateCommon *args)
args->start.use_dirty_ring = true;
/* Restart dst vm, src vm already show up so we needn't wait anymore */
- if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, &to, "defer", &args->start)) {
return;
}
/* Start migrate */
+ migrate_incoming_qmp(to, args->listen_uri, NULL, "{}");
migrate_qmp(from, to, args->connect_uri, NULL, "{}");
/* Wait for dirty limit throttle begin */
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* [PATCH v1 14/15] tests/qtest/migration: Stop passing URI into migrate_start
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (12 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 13/15] tests/qtest/migration: Use defer in dirty_limit test Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-12 14:27 ` Lukas Straub
2026-05-20 18:21 ` Peter Xu
2026-05-05 16:09 ` [PATCH v1 15/15] tests/qtest/migration: Unify URIs Fabiano Rosas
` (2 subsequent siblings)
16 siblings, 2 replies; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Xu, Lukas Straub, Laurent Vivier, Paolo Bonzini, Mark Kanda,
Ben Chaney
Don't allow changing the default -incoming URI via migrate_start. The
default is now -incoming defer. If a test really needs to alter this
(such as with CPR), the target_opts variable is still available to
change the command line.
(aside from the larger goal of using defer, this change is a step
towards allowing migrate_start() to be invoked only once for all
tests)
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/colo-tests.c | 2 +-
tests/qtest/migration/cpr-tests.c | 6 +++---
tests/qtest/migration/file-tests.c | 3 +--
tests/qtest/migration/framework.c | 17 ++++++++---------
tests/qtest/migration/framework.h | 5 ++---
tests/qtest/migration/misc-tests.c | 10 +++++-----
tests/qtest/migration/precopy-tests.c | 12 ++++++------
7 files changed, 26 insertions(+), 29 deletions(-)
diff --git a/tests/qtest/migration/colo-tests.c b/tests/qtest/migration/colo-tests.c
index 4add4a014b..a3d27e7bf6 100644
--- a/tests/qtest/migration/colo-tests.c
+++ b/tests/qtest/migration/colo-tests.c
@@ -45,7 +45,7 @@ static int test_colo_common(MigrateCommon *args,
args->start.caps[MIGRATION_CAPABILITY_RETURN_PATH] = true;
args->start.caps[MIGRATION_CAPABILITY_X_COLO] = true;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return -1;
}
diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
index 9091a84213..fc09dad9c0 100644
--- a/tests/qtest/migration/cpr-tests.c
+++ b/tests/qtest/migration/cpr-tests.c
@@ -60,7 +60,7 @@ static int test_transfer(MigrateCommon *args, const char *cpr_channel,
obj = migrate_str_to_channel(cpr_channel);
qlist_append(channels_list, obj);
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return -1;
}
@@ -179,7 +179,7 @@ static void set_cpr_exec_args(QTestState *who, MigrateCommon *args)
*/
g_assert(args->start.hide_stderr == false);
- ret = migrate_args(&from_args, &to_args, args->listen_uri, &args->start);
+ ret = migrate_args(&from_args, &to_args, &args->start);
g_assert(!ret);
qtest_from_args = qtest_qemu_args(from_args);
@@ -230,7 +230,7 @@ static void test_cpr_exec(MigrateCommon *args)
g_autofree char *filename = g_strdup_printf("%s/%s", tmpfs,
FILE_TEST_FILENAME);
- if (migrate_start(&from, NULL, "defer", &args->start)) {
+ if (migrate_start(&from, NULL, &args->start)) {
return;
}
diff --git a/tests/qtest/migration/file-tests.c b/tests/qtest/migration/file-tests.c
index 4b6a2eeb7b..36109d30ba 100644
--- a/tests/qtest/migration/file-tests.c
+++ b/tests/qtest/migration/file-tests.c
@@ -47,8 +47,7 @@ static void test_file_connect_outgoing_fd_leak(char *name, MigrateCommon *args)
return;
}
- args->listen_uri = "defer";
- if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index 9df33f8809..2acbe709b7 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -308,7 +308,7 @@ static char *migrate_mem_type_get_opts(MemType type, const char *memory_size)
return opts;
}
-int migrate_args(char **from, char **to, const char *uri, MigrateStart *args)
+int migrate_args(char **from, char **to, MigrateStart *args)
{
/* options for source and target */
g_autofree gchar *arch_opts = NULL;
@@ -423,11 +423,11 @@ int migrate_args(char **from, char **to, const char *uri, MigrateStart *args)
"-name target,debug-threads=on "
"%s "
"-serial file:%s/dest_serial "
- "-incoming %s "
+ "-incoming defer "
"%s %s %s %s",
kvm_opts ? kvm_opts : "",
machine, machine_opts,
- memory_backend, tmpfs, uri,
+ memory_backend, tmpfs,
events,
arch_opts ? arch_opts : "",
args->opts_target ? args->opts_target : "",
@@ -474,8 +474,7 @@ static void migrate_mem_type_cleanup(MemType type)
}
}
-int migrate_start(QTestState **from, QTestState **to, const char *uri,
- MigrateStart *args)
+int migrate_start(QTestState **from, QTestState **to, MigrateStart *args)
{
g_autofree gchar *cmd_source = NULL;
g_autofree gchar *cmd_target = NULL;
@@ -490,7 +489,7 @@ int migrate_start(QTestState **from, QTestState **to, const char *uri,
bootfile_create(qtest_get_arch(), tmpfs, args->suspend_me);
src_state.suspend_me = args->suspend_me;
- if (migrate_args(&cmd_source, &cmd_target, uri, args)) {
+ if (migrate_args(&cmd_source, &cmd_target, args)) {
return -1;
}
@@ -563,7 +562,7 @@ static int migrate_postcopy_prepare(QTestState **from_ptr,
args->start.caps[MIGRATION_CAPABILITY_POSTCOPY_BLOCKTIME] = true;
args->start.caps[MIGRATION_CAPABILITY_POSTCOPY_RAM] = true;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return -1;
}
@@ -842,7 +841,7 @@ int test_precopy_common(MigrateCommon *args)
args->listen_uri = "tcp:127.0.0.1:0";
}
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return -1;
}
@@ -991,7 +990,7 @@ void test_file_common(MigrateCommon *args, bool stop_src)
bool check_offset = false;
g_autofree char *uri = NULL;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
index 7635e9fac1..65d3912fda 100644
--- a/tests/qtest/migration/framework.h
+++ b/tests/qtest/migration/framework.h
@@ -230,9 +230,8 @@ void wait_for_serial(const char *side);
void migrate_prepare_for_dirty_mem(QTestState *from);
void migrate_wait_for_dirty_mem(QTestState *from, QTestState *to);
-int migrate_args(char **from, char **to, const char *uri, MigrateStart *args);
-int migrate_start(QTestState **from, QTestState **to, const char *uri,
- MigrateStart *args);
+int migrate_args(char **from, char **to, MigrateStart *args);
+int migrate_start(QTestState **from, QTestState **to, MigrateStart *args);
void migrate_end(QTestState *from, QTestState *to, bool test_dest);
void test_postcopy_common(MigrateCommon *args);
diff --git a/tests/qtest/migration/misc-tests.c b/tests/qtest/migration/misc-tests.c
index 8216b5d79d..e5d5fc4959 100644
--- a/tests/qtest/migration/misc-tests.c
+++ b/tests/qtest/migration/misc-tests.c
@@ -28,7 +28,7 @@ static void test_baddest(char *name, MigrateCommon *args)
args->start.hide_stderr = true;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
@@ -54,7 +54,7 @@ static void test_analyze_script(char *name, MigrateCommon *args)
return;
}
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
@@ -115,7 +115,7 @@ static void do_test_validate_uuid(MigrateStart *args, bool should_fail)
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
QTestState *from, *to;
- if (migrate_start(&from, &to, "defer", args)) {
+ if (migrate_start(&from, &to, args)) {
return;
}
@@ -180,7 +180,7 @@ static void do_test_validate_uri_channel(MigrateCommon *args)
QTestState *from, *to;
QObject *channels;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
@@ -234,7 +234,7 @@ static void test_validate_caps_pair(char *test_path, MigrateCommon *args)
args->start.hide_stderr = true;
args->start.only_source = true;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index b13e84e26d..a9381fa3bf 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -291,7 +291,7 @@ static void test_auto_converge(char *name, MigrateCommon *args)
uint64_t prev_dirty_sync_cnt, dirty_sync_cnt;
int max_try_count, hit = 0;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
@@ -470,7 +470,7 @@ static void test_multifd_tcp_cancel(MigrateCommon *args, bool postcopy_ram)
args->start.hide_stderr = true;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
@@ -516,7 +516,7 @@ static void test_multifd_tcp_cancel(MigrateCommon *args, bool postcopy_ram)
args->start.only_target = true;
- if (migrate_start(&from, &to2, "defer", &args->start)) {
+ if (migrate_start(&from, &to2, &args->start)) {
return;
}
@@ -690,7 +690,7 @@ static void test_cancel_src_after_status(char *test_path, MigrateCommon *args)
args->start.hide_stderr = true;
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
@@ -1029,7 +1029,7 @@ static void test_dirty_limit(char *name, MigrateCommon *args)
args->connect_uri = uri;
/* Start src, dst vm */
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
@@ -1077,7 +1077,7 @@ static void test_dirty_limit(char *name, MigrateCommon *args)
args->start.use_dirty_ring = true;
/* Restart dst vm, src vm already show up so we needn't wait anymore */
- if (migrate_start(&from, &to, "defer", &args->start)) {
+ if (migrate_start(&from, &to, &args->start)) {
return;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* Re: [PATCH v1 14/15] tests/qtest/migration: Stop passing URI into migrate_start
2026-05-05 16:09 ` [PATCH v1 14/15] tests/qtest/migration: Stop passing URI into migrate_start Fabiano Rosas
@ 2026-05-12 14:27 ` Lukas Straub
2026-05-20 18:21 ` Peter Xu
1 sibling, 0 replies; 39+ messages in thread
From: Lukas Straub @ 2026-05-12 14:27 UTC (permalink / raw)
To: Fabiano Rosas
Cc: qemu-devel, Peter Xu, Laurent Vivier, Paolo Bonzini, Mark Kanda,
Ben Chaney
[-- Attachment #1: Type: text/plain, Size: 1106 bytes --]
On Tue, 5 May 2026 13:09:13 -0300
Fabiano Rosas <farosas@suse.de> wrote:
> Don't allow changing the default -incoming URI via migrate_start. The
> default is now -incoming defer. If a test really needs to alter this
> (such as with CPR), the target_opts variable is still available to
> change the command line.
>
> (aside from the larger goal of using defer, this change is a step
> towards allowing migrate_start() to be invoked only once for all
> tests)
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
> tests/qtest/migration/colo-tests.c | 2 +-
> tests/qtest/migration/cpr-tests.c | 6 +++---
> tests/qtest/migration/file-tests.c | 3 +--
> tests/qtest/migration/framework.c | 17 ++++++++---------
> tests/qtest/migration/framework.h | 5 ++---
> tests/qtest/migration/misc-tests.c | 10 +++++-----
> tests/qtest/migration/precopy-tests.c | 12 ++++++------
> 7 files changed, 26 insertions(+), 29 deletions(-)
For migration/colo-tests.c:
Reviewed-by: Lukas Straub <lukasstraub2@web.de>
Tested-by: Lukas Straub <lukasstraub2@web.de>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v1 14/15] tests/qtest/migration: Stop passing URI into migrate_start
2026-05-05 16:09 ` [PATCH v1 14/15] tests/qtest/migration: Stop passing URI into migrate_start Fabiano Rosas
2026-05-12 14:27 ` Lukas Straub
@ 2026-05-20 18:21 ` Peter Xu
1 sibling, 0 replies; 39+ messages in thread
From: Peter Xu @ 2026-05-20 18:21 UTC (permalink / raw)
To: Fabiano Rosas
Cc: qemu-devel, Lukas Straub, Laurent Vivier, Paolo Bonzini,
Mark Kanda, Ben Chaney
On Tue, May 05, 2026 at 01:09:13PM -0300, Fabiano Rosas wrote:
> Don't allow changing the default -incoming URI via migrate_start. The
> default is now -incoming defer. If a test really needs to alter this
> (such as with CPR), the target_opts variable is still available to
> change the command line.
>
> (aside from the larger goal of using defer, this change is a step
> towards allowing migrate_start() to be invoked only once for all
> tests)
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Peter Xu <peterx@redhat.com>
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH v1 15/15] tests/qtest/migration: Unify URIs
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (13 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 14/15] tests/qtest/migration: Stop passing URI into migrate_start Fabiano Rosas
@ 2026-05-05 16:09 ` Fabiano Rosas
2026-05-12 14:26 ` Lukas Straub
2026-05-20 18:36 ` Peter Xu
2026-05-05 16:25 ` [PATCH v1 00/15] tests/qtest/migration: Always defer Peter Xu
2026-05-20 18:56 ` Peter Xu
16 siblings, 2 replies; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 16:09 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Xu, Lukas Straub, Laurent Vivier, Paolo Bonzini, Mark Kanda,
Ben Chaney
The migration tests have always used localhost migration and therefore
the same URI for both sides of migration. Change the listen_uri and
connect_uri into a single uri variable.
For migrations using sockets, there's the possibility of detecting the
socket address the destination side is using. For those, keep using
different variables for migrate_qmp and migrate_incoming_qmp.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
tests/qtest/migration/colo-tests.c | 8 ++++----
tests/qtest/migration/cpr-tests.c | 6 +++---
tests/qtest/migration/file-tests.c | 10 ++++-----
tests/qtest/migration/framework.c | 29 ++++++++++-----------------
tests/qtest/migration/framework.h | 14 ++++++-------
tests/qtest/migration/misc-tests.c | 4 ++--
tests/qtest/migration/precopy-tests.c | 17 ++++++++--------
tests/qtest/migration/tls-tests.c | 2 +-
8 files changed, 40 insertions(+), 50 deletions(-)
diff --git a/tests/qtest/migration/colo-tests.c b/tests/qtest/migration/colo-tests.c
index a3d27e7bf6..f7f9ba491b 100644
--- a/tests/qtest/migration/colo-tests.c
+++ b/tests/qtest/migration/colo-tests.c
@@ -55,12 +55,12 @@ static int test_colo_common(MigrateCommon *args,
data_hook = args->start_hook(from, to);
}
- migrate_incoming_qmp(to, args->listen_uri, NULL, "{}");
+ migrate_incoming_qmp(to, args->uri, NULL, "{}");
migrate_ensure_converge(from);
wait_for_serial("src_serial");
- migrate_qmp(from, to, args->connect_uri, NULL, "{}");
+ migrate_qmp(from, to, NULL, NULL, "{}");
wait_for_migration_status(from, "colo", NULL);
wait_for_resume(to, get_dst());
@@ -105,7 +105,7 @@ static void test_colo_plain_common(MigrateCommon *args,
bool failover_during_checkpoint,
bool primary_failover)
{
- args->listen_uri = "tcp:127.0.0.1:0";
+ args->uri = "tcp:127.0.0.1:0";
test_colo_common(args, failover_during_checkpoint, primary_failover);
}
@@ -113,7 +113,7 @@ static void test_colo_multifd_common(MigrateCommon *args,
bool failover_during_checkpoint,
bool primary_failover)
{
- args->listen_uri = "tcp:127.0.0.1:0";
+ args->uri = "tcp:127.0.0.1:0";
args->start.caps[MIGRATION_CAPABILITY_MULTIFD] = true;
test_colo_common(args, failover_during_checkpoint, primary_failover);
}
diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
index fc09dad9c0..0bec753b4a 100644
--- a/tests/qtest/migration/cpr-tests.c
+++ b/tests/qtest/migration/cpr-tests.c
@@ -35,7 +35,7 @@ static void test_mode_reboot(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
- args->connect_uri = uri;
+ args->uri = uri;
args->start_hook = migrate_hook_start_mode_reboot;
args->start.mem_type = MEM_TYPE_SHMEM;
@@ -226,7 +226,7 @@ static void test_cpr_exec(MigrateCommon *args)
{
QTestState *from, *to;
void *data_hook = NULL;
- g_autofree char *connect_uri = g_strdup(args->connect_uri);
+ g_autofree char *connect_uri = g_strdup(args->uri);
g_autofree char *filename = g_strdup_printf("%s/%s", tmpfs,
FILE_TEST_FILENAME);
@@ -280,7 +280,7 @@ static void test_mode_exec(char *name, MigrateCommon *args)
{
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
- args->connect_uri = uri;
+ args->uri = uri;
args->start_hook = test_mode_exec_start;
args->start.only_source = true;
diff --git a/tests/qtest/migration/file-tests.c b/tests/qtest/migration/file-tests.c
index 36109d30ba..5118d9dec9 100644
--- a/tests/qtest/migration/file-tests.c
+++ b/tests/qtest/migration/file-tests.c
@@ -107,7 +107,7 @@ static void test_precopy_file_offset_fdset(char *name, MigrateCommon *args)
{
g_autofree char *uri = g_strdup_printf("file:/dev/fdset/1,offset=%d",
FILE_TEST_OFFSET);
- args->connect_uri = uri;
+ args->uri = uri;
args->start_hook = migrate_hook_start_file_offset_fdset;
test_file_common(args, false);
@@ -120,7 +120,7 @@ static void test_precopy_file_offset(char *name, MigrateCommon *args)
FILE_TEST_FILENAME,
FILE_TEST_OFFSET);
- args->connect_uri = uri;
+ args->uri = uri;
test_file_common(args, false);
}
@@ -130,7 +130,7 @@ static void test_precopy_file_offset_bad(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:%s/%s,offset=0x20M",
tmpfs, FILE_TEST_FILENAME);
- args->connect_uri = uri;
+ args->uri = uri;
args->result = MIG_TEST_QMP_ERROR;
test_file_common(args, false);
@@ -247,7 +247,7 @@ static void test_multifd_file_mapped_ram_fdset(char *name, MigrateCommon *args)
g_autofree char *uri = g_strdup_printf("file:/dev/fdset/1,offset=%d",
FILE_TEST_OFFSET);
- args->connect_uri = uri;
+ args->uri = uri;
args->start_hook = migrate_hook_start_multifd_mapped_ram_fdset;
args->end_hook = migrate_hook_end_multifd_mapped_ram_fdset;
@@ -262,7 +262,7 @@ static void test_multifd_file_mapped_ram_fdset_dio(char *name,
{
g_autofree char *uri = g_strdup_printf("file:/dev/fdset/1,offset=%d",
FILE_TEST_OFFSET);
- args->connect_uri = uri;
+ args->uri = uri;
args->start_hook = migrate_hook_start_multifd_mapped_ram_fdset_dio;
args->end_hook = migrate_hook_end_multifd_mapped_ram_fdset;
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index 2acbe709b7..17bcd28c66 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -832,14 +832,7 @@ int test_precopy_common(MigrateCommon *args)
QTestState *from, *to;
void *data_hook = NULL;
QObject *channels = NULL;
-
- assert(!args->connect_uri);
-
- if (args->listen_uri) {
- args->connect_uri = args->listen_uri;
- } else {
- args->listen_uri = "tcp:127.0.0.1:0";
- }
+ const char *listen_uri = args->uri ?: "tcp:127.0.0.1:0";
if (migrate_start(&from, &to, &args->start)) {
return -1;
@@ -849,7 +842,7 @@ int test_precopy_common(MigrateCommon *args)
data_hook = args->start_hook(from, to);
}
- migrate_incoming_qmp(to, args->listen_uri, NULL, "{}");
+ migrate_incoming_qmp(to, listen_uri, NULL, "{}");
/* Wait for the first serial output from the source */
if (args->result == MIG_TEST_SUCCEED) {
@@ -879,11 +872,11 @@ int test_precopy_common(MigrateCommon *args)
}
if (args->result == MIG_TEST_QMP_ERROR) {
- migrate_qmp_fail(from, args->connect_uri, channels, "{}");
+ migrate_qmp_fail(from, args->uri, channels, "{}");
goto finish;
}
- migrate_qmp(from, to, args->connect_uri, channels, "{}");
+ migrate_qmp(from, to, args->uri, channels, "{}");
if (args->result != MIG_TEST_SUCCEED) {
bool allow_active = args->result == MIG_TEST_FAIL;
@@ -947,7 +940,7 @@ void test_precopy_unix_common(MigrateCommon *args)
{
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
- args->listen_uri = uri;
+ args->uri = uri;
test_precopy_common(args);
}
@@ -994,9 +987,9 @@ void test_file_common(MigrateCommon *args, bool stop_src)
return;
}
- if (!args->connect_uri) {
+ if (!args->uri) {
uri = g_strdup_printf("file:%s/%s", tmpfs, FILE_TEST_FILENAME);
- args->connect_uri = uri;
+ args->uri = uri;
}
/*
@@ -1006,7 +999,7 @@ void test_file_common(MigrateCommon *args, bool stop_src)
*/
g_assert_false(args->live);
- if (g_strrstr(args->connect_uri, "offset=")) {
+ if (g_strrstr(args->uri, "offset=")) {
check_offset = true;
/*
* This comes before the start_hook because it's equivalent to
@@ -1029,18 +1022,18 @@ void test_file_common(MigrateCommon *args, bool stop_src)
}
if (args->result == MIG_TEST_QMP_ERROR) {
- migrate_qmp_fail(from, args->connect_uri, NULL, "{}");
+ migrate_qmp_fail(from, args->uri, NULL, "{}");
goto finish;
}
- migrate_qmp(from, to, args->connect_uri, NULL, "{}");
+ migrate_qmp(from, to, args->uri, NULL, "{}");
wait_for_migration_complete(from);
/*
* We need to wait for the source to finish before starting the
* destination.
*/
- migrate_incoming_qmp(to, args->connect_uri, NULL, "{}");
+ migrate_incoming_qmp(to, args->uri, NULL, "{}");
wait_for_migration_complete(to);
if (stop_src) {
diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
index 65d3912fda..eceb40abbf 100644
--- a/tests/qtest/migration/framework.h
+++ b/tests/qtest/migration/framework.h
@@ -162,16 +162,14 @@ typedef struct {
/* Optional: fine tune start parameters */
MigrateStart start;
- /* Required: the URI for the dst QEMU to listen on */
- const char *listen_uri;
-
/*
- * Optional: the URI for the src QEMU to connect to
- * If NULL, then it will query the dst QEMU for its actual
- * listening address and use that as the connect address.
- * This allows for dynamically picking a free TCP port.
+ * Optional: the migration URI. If NULL, the common code should
+ * provide a default. For socket migration, the source QEMU may
+ * query the dst QEMU for the listening address and use that as
+ * the connection address. This allows for dynamically picking a
+ * free TCP port.
*/
- const char *connect_uri;
+ const char *uri;
/*
* Optional: JSON-formatted list of src QEMU URIs. If a port is
diff --git a/tests/qtest/migration/misc-tests.c b/tests/qtest/migration/misc-tests.c
index e5d5fc4959..ec6d438cdc 100644
--- a/tests/qtest/migration/misc-tests.c
+++ b/tests/qtest/migration/misc-tests.c
@@ -196,7 +196,7 @@ static void do_test_validate_uri_channel(MigrateCommon *args)
channels = args->connect_channels ?
qobject_from_json(args->connect_channels, &error_abort) :
NULL;
- migrate_qmp_fail(from, args->connect_uri, channels, "{}");
+ migrate_qmp_fail(from, args->uri, channels, "{}");
migrate_end(from, to, false);
}
@@ -252,7 +252,7 @@ static void test_validate_caps_pair(char *test_path, MigrateCommon *args)
static void test_validate_uri_channels_both_set(char *name, MigrateCommon *args)
{
- args->connect_uri = "tcp:127.0.0.1:0",
+ args->uri = "tcp:127.0.0.1:0",
args->connect_channels = ("[ { ""'channel-type': 'main',"
" 'addr': { 'transport': 'socket',"
" 'type': 'inet',"
diff --git a/tests/qtest/migration/precopy-tests.c b/tests/qtest/migration/precopy-tests.c
index a9381fa3bf..55ad77ef0d 100644
--- a/tests/qtest/migration/precopy-tests.c
+++ b/tests/qtest/migration/precopy-tests.c
@@ -161,7 +161,7 @@ static void __test_precopy_rdma_plain(MigrateCommon *args, bool ipv6)
**/
g_autofree char *uri = g_strdup_printf("rdma:%s:29200", buffer);
- args->listen_uri = uri;
+ args->uri = uri;
test_precopy_common(args);
}
@@ -253,7 +253,7 @@ static void migrate_hook_end_fd(QTestState *from,
static void test_precopy_fd_socket(char *name, MigrateCommon *args)
{
- args->listen_uri = "fd:fd-mig";
+ args->uri = "fd:fd-mig";
args->start_hook = migrate_hook_start_fd;
args->end_hook = migrate_hook_end_fd;
@@ -1026,7 +1026,7 @@ static void test_dirty_limit(char *name, MigrateCommon *args)
args->start.hide_stderr = true;
args->start.use_dirty_ring = true;
- args->connect_uri = uri;
+ args->uri = uri;
/* Start src, dst vm */
if (migrate_start(&from, &to, &args->start)) {
@@ -1037,8 +1037,8 @@ static void test_dirty_limit(char *name, MigrateCommon *args)
migrate_dirty_limit_wait_showup(from, dirtylimit_period, dirtylimit_value);
/* Start migrate */
- migrate_incoming_qmp(to, args->connect_uri, NULL, "{}");
- migrate_qmp(from, to, args->connect_uri, NULL, "{}");
+ migrate_incoming_qmp(to, args->uri, NULL, "{}");
+ migrate_qmp(from, to, args->uri, NULL, "{}");
/* Wait for dirty limit throttle begin */
throttle_us_per_full = 0;
@@ -1070,8 +1070,7 @@ static void test_dirty_limit(char *name, MigrateCommon *args)
/* Assert dirty limit is not in service */
g_assert_cmpint(throttle_us_per_full, ==, 0);
- args->listen_uri = uri;
- args->connect_uri = uri;
+ args->uri = uri;
args->start.only_target = true;
args->start.use_dirty_ring = true;
@@ -1082,8 +1081,8 @@ static void test_dirty_limit(char *name, MigrateCommon *args)
}
/* Start migrate */
- migrate_incoming_qmp(to, args->listen_uri, NULL, "{}");
- migrate_qmp(from, to, args->connect_uri, NULL, "{}");
+ migrate_incoming_qmp(to, args->uri, NULL, "{}");
+ migrate_qmp(from, to, args->uri, NULL, "{}");
/* Wait for dirty limit throttle begin */
throttle_us_per_full = 0;
diff --git a/tests/qtest/migration/tls-tests.c b/tests/qtest/migration/tls-tests.c
index f45f4c4b0c..827cc7bcf8 100644
--- a/tests/qtest/migration/tls-tests.c
+++ b/tests/qtest/migration/tls-tests.c
@@ -436,7 +436,7 @@ static void test_precopy_unix_tls_x509_default_host(char *name,
{
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
- args->listen_uri = uri;
+ args->uri = uri;
args->start_hook = migrate_hook_start_tls_x509_default_host;
args->end_hook = migrate_hook_end_tls_x509;
args->result = MIG_TEST_FAIL;
--
2.51.0
^ permalink raw reply related [flat|nested] 39+ messages in thread* Re: [PATCH v1 15/15] tests/qtest/migration: Unify URIs
2026-05-05 16:09 ` [PATCH v1 15/15] tests/qtest/migration: Unify URIs Fabiano Rosas
@ 2026-05-12 14:26 ` Lukas Straub
2026-05-20 18:36 ` Peter Xu
1 sibling, 0 replies; 39+ messages in thread
From: Lukas Straub @ 2026-05-12 14:26 UTC (permalink / raw)
To: Fabiano Rosas
Cc: qemu-devel, Peter Xu, Laurent Vivier, Paolo Bonzini, Mark Kanda,
Ben Chaney
[-- Attachment #1: Type: text/plain, Size: 1192 bytes --]
On Tue, 5 May 2026 13:09:14 -0300
Fabiano Rosas <farosas@suse.de> wrote:
> The migration tests have always used localhost migration and therefore
> the same URI for both sides of migration. Change the listen_uri and
> connect_uri into a single uri variable.
>
> For migrations using sockets, there's the possibility of detecting the
> socket address the destination side is using. For those, keep using
> different variables for migrate_qmp and migrate_incoming_qmp.
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
> tests/qtest/migration/colo-tests.c | 8 ++++----
> tests/qtest/migration/cpr-tests.c | 6 +++---
> tests/qtest/migration/file-tests.c | 10 ++++-----
> tests/qtest/migration/framework.c | 29 ++++++++++-----------------
> tests/qtest/migration/framework.h | 14 ++++++-------
> tests/qtest/migration/misc-tests.c | 4 ++--
> tests/qtest/migration/precopy-tests.c | 17 ++++++++--------
> tests/qtest/migration/tls-tests.c | 2 +-
> 8 files changed, 40 insertions(+), 50 deletions(-)
For migration/colo-tests.c:
Reviewed-by: Lukas Straub <lukasstraub2@web.de>
Tested-by: Lukas Straub <lukasstraub2@web.de>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v1 15/15] tests/qtest/migration: Unify URIs
2026-05-05 16:09 ` [PATCH v1 15/15] tests/qtest/migration: Unify URIs Fabiano Rosas
2026-05-12 14:26 ` Lukas Straub
@ 2026-05-20 18:36 ` Peter Xu
1 sibling, 0 replies; 39+ messages in thread
From: Peter Xu @ 2026-05-20 18:36 UTC (permalink / raw)
To: Fabiano Rosas
Cc: qemu-devel, Lukas Straub, Laurent Vivier, Paolo Bonzini,
Mark Kanda, Ben Chaney
On Tue, May 05, 2026 at 01:09:14PM -0300, Fabiano Rosas wrote:
> The migration tests have always used localhost migration and therefore
> the same URI for both sides of migration. Change the listen_uri and
> connect_uri into a single uri variable.
>
> For migrations using sockets, there's the possibility of detecting the
> socket address the destination side is using. For those, keep using
> different variables for migrate_qmp and migrate_incoming_qmp.
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Peter Xu <peterx@redhat.com>
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v1 00/15] tests/qtest/migration: Always defer
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (14 preceding siblings ...)
2026-05-05 16:09 ` [PATCH v1 15/15] tests/qtest/migration: Unify URIs Fabiano Rosas
@ 2026-05-05 16:25 ` Peter Xu
2026-05-05 19:06 ` Fabiano Rosas
2026-05-20 18:56 ` Peter Xu
16 siblings, 1 reply; 39+ messages in thread
From: Peter Xu @ 2026-05-05 16:25 UTC (permalink / raw)
To: Fabiano Rosas; +Cc: qemu-devel
On Tue, May 05, 2026 at 01:08:59PM -0300, Fabiano Rosas wrote:
> As discussed before, change the tests to always use -incoming
> defer. Also remove one of the uris from MigrateCommon, a single uri is
> enough.
A quick question before reading into details: do we want to still keep
-incoming URI to work for QEMU? If yes, do we still want still a tiny bit
of test coverage for them?
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread* Re: [PATCH v1 00/15] tests/qtest/migration: Always defer
2026-05-05 16:25 ` [PATCH v1 00/15] tests/qtest/migration: Always defer Peter Xu
@ 2026-05-05 19:06 ` Fabiano Rosas
2026-05-19 20:34 ` Peter Xu
0 siblings, 1 reply; 39+ messages in thread
From: Fabiano Rosas @ 2026-05-05 19:06 UTC (permalink / raw)
To: Peter Xu; +Cc: qemu-devel
Peter Xu <peterx@redhat.com> writes:
> On Tue, May 05, 2026 at 01:08:59PM -0300, Fabiano Rosas wrote:
>> As discussed before, change the tests to always use -incoming
>> defer. Also remove one of the uris from MigrateCommon, a single uri is
>> enough.
>
> A quick question before reading into details: do we want to still keep
> -incoming URI to work for QEMU? If yes, do we still want still a tiny bit
> of test coverage for them?
I would think so. There is some coverage with the cpr tests, they're
still passing -incoming <uri> -incoming <cpr_channel>. Do you think
that's enough?
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v1 00/15] tests/qtest/migration: Always defer
2026-05-05 19:06 ` Fabiano Rosas
@ 2026-05-19 20:34 ` Peter Xu
0 siblings, 0 replies; 39+ messages in thread
From: Peter Xu @ 2026-05-19 20:34 UTC (permalink / raw)
To: Fabiano Rosas; +Cc: qemu-devel
On Tue, May 05, 2026 at 04:06:49PM -0300, Fabiano Rosas wrote:
> Peter Xu <peterx@redhat.com> writes:
>
> > On Tue, May 05, 2026 at 01:08:59PM -0300, Fabiano Rosas wrote:
> >> As discussed before, change the tests to always use -incoming
> >> defer. Also remove one of the uris from MigrateCommon, a single uri is
> >> enough.
> >
> > A quick question before reading into details: do we want to still keep
> > -incoming URI to work for QEMU? If yes, do we still want still a tiny bit
> > of test coverage for them?
>
> I would think so. There is some coverage with the cpr tests, they're
> still passing -incoming <uri> -incoming <cpr_channel>. Do you think
> that's enough?
Yeah, I think it'll be fine.
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v1 00/15] tests/qtest/migration: Always defer
2026-05-05 16:08 [PATCH v1 00/15] tests/qtest/migration: Always defer Fabiano Rosas
` (15 preceding siblings ...)
2026-05-05 16:25 ` [PATCH v1 00/15] tests/qtest/migration: Always defer Peter Xu
@ 2026-05-20 18:56 ` Peter Xu
16 siblings, 0 replies; 39+ messages in thread
From: Peter Xu @ 2026-05-20 18:56 UTC (permalink / raw)
To: Fabiano Rosas; +Cc: qemu-devel
On Tue, May 05, 2026 at 01:08:59PM -0300, Fabiano Rosas wrote:
> As discussed before, change the tests to always use -incoming
> defer. Also remove one of the uris from MigrateCommon, a single uri is
> enough.
>
> CI run: https://gitlab.com/farosas/qemu/-/pipelines/2501387628
queued, thanks!
--
Peter Xu
^ permalink raw reply [flat|nested] 39+ messages in thread