From: Peter Xu <peterx@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, "Fabiano Rosas" <farosas@suse.de>,
"Dr . David Alan Gilbert" <dave@treblig.org>,
"Eric Blake" <eblake@redhat.com>, "Kevin Wolf" <kwolf@redhat.com>,
"Vladimir Sementsov-Ogievskiy" <vsementsov@yandex-team.ru>,
"Daniel P . Berrangé" <berrange@redhat.com>,
"Andrey Drobyshev" <andrey.drobyshev@virtuozzo.com>,
peterx@redhat.com, "Stefan Hajnoczi" <stefanha@redhat.com>
Subject: [PATCH RFC 09/11] tests/qtest/migration: Don't use hardcoded strings for -serial
Date: Tue, 3 Dec 2024 19:51:36 -0500 [thread overview]
Message-ID: <20241204005138.702289-10-peterx@redhat.com> (raw)
In-Reply-To: <20241204005138.702289-1-peterx@redhat.com>
From: Fabiano Rosas <farosas@suse.de>
Stop using hardcoded strings for -serial so we can in the next patches
perform more than one migration in a row. Having the serial path
hardcoded means we cannot reuse the code when dst becomes the new src.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/r/20241125144612.16194-3-farosas@suse.de
Signed-off-by: Peter Xu <peterx@redhat.com>
---
tests/qtest/migration-helpers.h | 2 +
tests/qtest/migration-helpers.c | 8 ++++
tests/qtest/migration-test.c | 68 ++++++++++++++++++---------------
3 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/tests/qtest/migration-helpers.h b/tests/qtest/migration-helpers.h
index 72dba369fb..c7a36a33d6 100644
--- a/tests/qtest/migration-helpers.h
+++ b/tests/qtest/migration-helpers.h
@@ -20,6 +20,7 @@ typedef struct QTestMigrationState {
bool resume_seen;
bool suspend_seen;
bool suspend_me;
+ char *serial;
} QTestMigrationState;
bool migrate_watch_for_events(QTestState *who, const char *name,
@@ -64,5 +65,6 @@ static inline bool probe_o_direct_support(const char *tmpfs)
#endif
void migration_test_add(const char *path, void (*fn)(void));
void migration_event_wait(QTestState *s, const char *target);
+char *migrate_get_unique_serial(const char *tmpfs);
#endif /* MIGRATION_HELPERS_H */
diff --git a/tests/qtest/migration-helpers.c b/tests/qtest/migration-helpers.c
index 3f8ba7fa8e..7c0b54ce0e 100644
--- a/tests/qtest/migration-helpers.c
+++ b/tests/qtest/migration-helpers.c
@@ -528,3 +528,11 @@ void migration_event_wait(QTestState *s, const char *target)
qobject_unref(response);
} while (!found);
}
+
+char *migrate_get_unique_serial(const char *tmpfs)
+{
+ static int i;
+
+ assert(i < INT_MAX);
+ return g_strdup_printf("%s/serial_%d", tmpfs, i++);
+}
diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index eafc2da806..1452778c81 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -192,9 +192,8 @@ static void bootfile_create(char *dir, bool suspend_me)
* we get an 'A' followed by an endless string of 'B's
* but on the destination we won't have the A (unless we enabled suspend/resume)
*/
-static void wait_for_serial(const char *side)
+static void wait_for_serial(const char *serialpath)
{
- g_autofree char *serialpath = g_strdup_printf("%s/%s", tmpfs, side);
FILE *serialfile = fopen(serialpath, "r");
do {
@@ -216,7 +215,7 @@ static void wait_for_serial(const char *side)
break;
default:
- fprintf(stderr, "Unexpected %d on %s serial\n", readvalue, side);
+ fprintf(stderr, "Unexpected %d on %s\n", readvalue, serialpath);
g_assert_not_reached();
}
} while (true);
@@ -818,16 +817,17 @@ static int test_migrate_start(QTestState **from, QTestState **to,
src_state = (QTestMigrationState) { };
src_state.suspend_me = args->suspend_me;
+ src_state.serial = migrate_get_unique_serial(tmpfs);
cmd_source = g_strdup_printf("-accel kvm%s -accel tcg "
"-machine %s,%s "
"-name source,debug-threads=on "
"-m %s "
- "-serial file:%s/src_serial "
+ "-serial file:%s "
"%s %s %s %s %s",
kvm_opts ? kvm_opts : "",
machine, machine_opts,
- memory_size, tmpfs,
+ memory_size, src_state.serial,
arch_opts ? arch_opts : "",
arch_source ? arch_source : "",
shmem_opts ? shmem_opts : "",
@@ -841,17 +841,18 @@ static int test_migrate_start(QTestState **from, QTestState **to,
}
dst_state = (QTestMigrationState) { };
+ dst_state.serial = migrate_get_unique_serial(tmpfs);
cmd_target = g_strdup_printf("-accel kvm%s -accel tcg "
"-machine %s,%s "
"-name target,debug-threads=on "
"-m %s "
- "-serial file:%s/dest_serial "
+ "-serial file:%s "
"-incoming %s "
"%s %s %s %s %s",
kvm_opts ? kvm_opts : "",
machine, machine_opts,
- memory_size, tmpfs, uri,
+ memory_size, dst_state.serial, uri,
arch_opts ? arch_opts : "",
arch_target ? arch_target : "",
shmem_opts ? shmem_opts : "",
@@ -911,8 +912,10 @@ static void test_migrate_end(QTestState *from, QTestState *to, bool test_dest)
qtest_quit(to);
cleanup("migsocket");
- cleanup("src_serial");
- cleanup("dest_serial");
+ unlink(src_state.serial);
+ g_free(src_state.serial);
+ unlink(dst_state.serial);
+ g_free(dst_state.serial);
cleanup(FILE_TEST_FILENAME);
}
@@ -1290,7 +1293,7 @@ static int migrate_postcopy_prepare(QTestState **from_ptr,
" 'port': '0' } } ] } }");
/* Wait for the first serial output from the source */
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
wait_for_suspend(from, &src_state);
migrate_qmp(from, to, NULL, NULL, "{}");
@@ -1314,7 +1317,7 @@ static void migrate_postcopy_complete(QTestState *from, QTestState *to,
}
/* Make sure we get at least one "B" on destination */
- wait_for_serial("dest_serial");
+ wait_for_serial(dst_state.serial);
if (uffd_feature_thread_id) {
read_blocktime(to);
@@ -1719,7 +1722,7 @@ static void test_precopy_common(MigrateCommon *args)
/* Wait for the first serial output from the source */
if (args->result == MIG_TEST_SUCCEED) {
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
wait_for_suspend(from, &src_state);
}
@@ -1796,7 +1799,7 @@ static void test_precopy_common(MigrateCommon *args)
qtest_qmp_assert_success(to, "{'execute': 'system_wakeup'}");
}
- wait_for_serial("dest_serial");
+ wait_for_serial(dst_state.serial);
}
finish:
@@ -1871,7 +1874,7 @@ static void test_file_common(MigrateCommon *args, bool stop_src)
}
migrate_ensure_converge(from);
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
if (stop_src) {
qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}");
@@ -1898,7 +1901,7 @@ static void test_file_common(MigrateCommon *args, bool stop_src)
}
wait_for_resume(to, &dst_state);
- wait_for_serial("dest_serial");
+ wait_for_serial(dst_state.serial);
if (check_offset) {
file_check_offset_region();
@@ -2041,7 +2044,7 @@ static void test_ignore_shared(void)
migrate_set_capability(to, "x-ignore-shared", true);
/* Wait for the first serial output from the source */
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
migrate_qmp(from, to, uri, NULL, "{}");
@@ -2051,7 +2054,7 @@ static void test_ignore_shared(void)
qtest_qmp_eventwait(to, "RESUME");
- wait_for_serial("dest_serial");
+ wait_for_serial(dst_state.serial);
wait_for_migration_complete(from);
/* Check whether shared RAM has been really skipped */
@@ -2669,7 +2672,7 @@ static void do_test_validate_uuid(MigrateStart *args, bool should_fail)
migrate_set_capability(from, "validate-uuid", true);
/* Wait for the first serial output from the source */
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
migrate_qmp(from, to, uri, NULL, "{}");
@@ -2733,7 +2736,7 @@ static void do_test_validate_uri_channel(MigrateCommon *args)
}
/* Wait for the first serial output from the source */
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
/*
* 'uri' and 'channels' validation is checked even before the migration
@@ -2823,7 +2826,7 @@ static void test_migrate_auto_converge(void)
migrate_set_capability(from, "pause-before-switchover", true);
/* Wait for the first serial output from the source */
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
migrate_qmp(from, to, uri, NULL, "{}");
@@ -2885,7 +2888,7 @@ static void test_migrate_auto_converge(void)
qtest_qmp_eventwait(to, "RESUME");
- wait_for_serial("dest_serial");
+ wait_for_serial(dst_state.serial);
wait_for_migration_complete(from);
test_migrate_end(from, to, true);
@@ -3296,7 +3299,7 @@ static void test_multifd_tcp_cancel(void)
migrate_incoming_qmp(to, "tcp:127.0.0.1:0", "{}");
/* Wait for the first serial output from the source */
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
migrate_qmp(from, to, NULL, NULL, "{}");
@@ -3307,7 +3310,8 @@ static void test_multifd_tcp_cancel(void)
/* Make sure QEMU process "to" exited */
qtest_set_expected_status(to, EXIT_FAILURE);
qtest_wait_qemu(to);
- qtest_quit(to);
+ unlink(dst_state.serial);
+ g_free(dst_state.serial);
/*
* Ensure the source QEMU finishes its cancellation process before we
@@ -3345,7 +3349,7 @@ static void test_multifd_tcp_cancel(void)
wait_for_stop(from, &src_state);
qtest_qmp_eventwait(to2, "RESUME");
- wait_for_serial("dest_serial");
+ wait_for_serial(dst_state.serial);
wait_for_migration_complete(from);
test_migrate_end(from, to2, true);
}
@@ -3488,13 +3492,16 @@ static QTestState *dirtylimit_start_vm(void)
QTestState *vm = NULL;
g_autofree gchar *cmd = NULL;
+ src_state = (QTestMigrationState) { };
+ src_state.serial = migrate_get_unique_serial(tmpfs);
+
bootfile_create(tmpfs, false);
cmd = g_strdup_printf("-accel kvm,dirty-ring-size=4096 "
"-name dirtylimit-test,debug-threads=on "
"-m 150M -smp 1 "
- "-serial file:%s/vm_serial "
+ "-serial file:%s "
"-drive file=%s,format=raw ",
- tmpfs, bootpath);
+ src_state.serial, bootpath);
vm = qtest_init(cmd);
return vm;
@@ -3503,7 +3510,8 @@ static QTestState *dirtylimit_start_vm(void)
static void dirtylimit_stop_vm(QTestState *vm)
{
qtest_quit(vm);
- cleanup("vm_serial");
+ unlink(src_state.serial);
+ g_free(src_state.serial);
}
static void test_vcpu_dirty_limit(void)
@@ -3519,7 +3527,7 @@ static void test_vcpu_dirty_limit(void)
vm = dirtylimit_start_vm();
/* Wait for the first serial output from the vm*/
- wait_for_serial("vm_serial");
+ wait_for_serial(src_state.serial);
/* Do dirtyrate measurement with calc time equals 1s */
calc_dirty_rate(vm, 1);
@@ -3612,7 +3620,7 @@ static void migrate_dirty_limit_wait_showup(QTestState *from,
migrate_set_capability(from, "pause-before-switchover", true);
/* Wait for the serial output from the source */
- wait_for_serial("src_serial");
+ wait_for_serial(src_state.serial);
}
/*
@@ -3751,7 +3759,7 @@ static void test_migrate_dirty_limit(void)
qtest_qmp_eventwait(to, "RESUME");
- wait_for_serial("dest_serial");
+ wait_for_serial(dst_state.serial);
wait_for_migration_complete(from);
test_migrate_end(from, to, true);
--
2.47.0
next prev parent reply other threads:[~2024-12-04 0:53 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-04 0:51 [PATCH RFC 00/11] migration/block: disk activation rewrite Peter Xu
2024-12-04 0:51 ` [PATCH RFC 01/11] migration: Add helper to get target runstate Peter Xu
2024-12-04 0:51 ` [PATCH RFC 02/11] migration/block: Make late-block-active the default Peter Xu
2024-12-04 0:51 ` [PATCH RFC 03/11] migration/block: Apply late-block-active behavior to postcopy Peter Xu
2024-12-04 0:51 ` [PATCH RFC 04/11] migration/block: Fix possible race with block_inactive Peter Xu
2024-12-04 0:51 ` [PATCH RFC 05/11] migration/block: Merge block reactivations for fail/cancel Peter Xu
2024-12-04 0:51 ` [PATCH RFC 06/11] migration/block: Extend the migration_block_* API to dest side Peter Xu
2024-12-04 14:49 ` Peter Xu
2024-12-04 0:51 ` [PATCH RFC 07/11] migration/block: Apply the migration_block_* API to postcopy Peter Xu
2024-12-04 0:51 ` [PATCH RFC 08/11] tests/qtest/migration: Move more code under only_target Peter Xu
2024-12-04 0:51 ` Peter Xu [this message]
2024-12-04 19:11 ` [PATCH RFC 09/11] tests/qtest/migration: Don't use hardcoded strings for -serial Fabiano Rosas
2024-12-04 0:51 ` [PATCH RFC 10/11] tests/qtest/migration: Support cleaning up only one side of migration Peter Xu
2024-12-04 0:51 ` [PATCH RFC 11/11] tests/qtest/migration: Test successive migrations Peter Xu
2024-12-04 17:25 ` [PATCH RFC 00/11] migration/block: disk activation rewrite Peter Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241204005138.702289-10-peterx@redhat.com \
--to=peterx@redhat.com \
--cc=andrey.drobyshev@virtuozzo.com \
--cc=berrange@redhat.com \
--cc=dave@treblig.org \
--cc=eblake@redhat.com \
--cc=farosas@suse.de \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@yandex-team.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).