From: Steven Sistare <steven.sistare@oracle.com>
To: Peter Xu <peterx@redhat.com>
Cc: qemu-devel@nongnu.org, "Juan Quintela" <quintela@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>
Subject: Re: [PATCH V4 07/11] tests/qtest: migration events
Date: Mon, 13 Nov 2023 13:33:05 -0500 [thread overview]
Message-ID: <f42c8267-5885-442d-a2dd-a57a77d5efe1@oracle.com> (raw)
In-Reply-To: <ZO91uYBncX3VE0D6@x1n>
On 8/30/2023 1:00 PM, Peter Xu wrote:
> On Tue, Aug 29, 2023 at 11:18:02AM -0700, Steve Sistare wrote:
>> Define a state object to capture events seen by migration tests, to allow
>> more events to be captured in a subsequent patch, and simplify event
>> checking in wait_for_migration_pass. No functional change.
>>
>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>> Reviewed-by: Fabiano Rosas <farosas@suse.de>
>> ---
>> tests/qtest/migration-helpers.c | 24 +++++----------
>> tests/qtest/migration-helpers.h | 8 +++--
>> tests/qtest/migration-test.c | 68 +++++++++++++++++++----------------------
>> 3 files changed, 44 insertions(+), 56 deletions(-)
>>
>> diff --git a/tests/qtest/migration-helpers.c b/tests/qtest/migration-helpers.c
>> index be00c52..b541108 100644
>> --- a/tests/qtest/migration-helpers.c
>> +++ b/tests/qtest/migration-helpers.c
>> @@ -23,26 +23,16 @@
>> */
>> #define MIGRATION_STATUS_WAIT_TIMEOUT 120
>>
>> -bool migrate_watch_for_stop(QTestState *who, const char *name,
>> - QDict *event, void *opaque)
>> -{
>> - bool *seen = opaque;
>> -
>> - if (g_str_equal(name, "STOP")) {
>> - *seen = true;
>> - return true;
>> - }
>> -
>> - return false;
>> -}
>> -
>> -bool migrate_watch_for_resume(QTestState *who, const char *name,
>> +bool migrate_watch_for_events(QTestState *who, const char *name,
>> QDict *event, void *opaque)
>> {
>> - bool *seen = opaque;
>> + QTestMigrationState *state = opaque;
>>
>> - if (g_str_equal(name, "RESUME")) {
>> - *seen = true;
>> + if (g_str_equal(name, "STOP")) {
>> + state->stop_seen = true;
>> + return true;
>> + } else if (g_str_equal(name, "RESUME")) {
>> + state->resume_seen = true;
>> return true;
>> }
>>
>> diff --git a/tests/qtest/migration-helpers.h b/tests/qtest/migration-helpers.h
>> index 009e250..59fbb83 100644
>> --- a/tests/qtest/migration-helpers.h
>> +++ b/tests/qtest/migration-helpers.h
>> @@ -15,9 +15,11 @@
>>
>> #include "libqtest.h"
>>
>> -bool migrate_watch_for_stop(QTestState *who, const char *name,
>> - QDict *event, void *opaque);
>> -bool migrate_watch_for_resume(QTestState *who, const char *name,
>> +typedef struct QTestMigrationState {
>> + bool stop_seen, resume_seen;
>> +} QTestMigrationState;
>> +
>> +bool migrate_watch_for_events(QTestState *who, const char *name,
>> QDict *event, void *opaque);
>>
>> G_GNUC_PRINTF(3, 4)
>> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
>> index 62d3f37..526a1b7 100644
>> --- a/tests/qtest/migration-test.c
>> +++ b/tests/qtest/migration-test.c
>> @@ -43,8 +43,8 @@
>> unsigned start_address;
>> unsigned end_address;
>> static bool uffd_feature_thread_id;
>> -static bool got_src_stop;
>> -static bool got_dst_resume;
>> +static QTestMigrationState src_state;
>> +static QTestMigrationState dst_state;
>>
>> /*
>> * An initial 3 MB offset is used as that corresponds
>> @@ -188,6 +188,13 @@ static void wait_for_serial(const char *side)
>> } while (true);
>> }
>>
>> +static void wait_for_stop(QTestState *who, QTestMigrationState *state)
>> +{
>> + if (!state->stop_seen) {
>> + qtest_qmp_eventwait(who, "STOP");
>> + }
>> +}
>> +
>> /*
>> * It's tricky to use qemu's migration event capability with qtest,
>> * events suddenly appearing confuse the qmp()/hmp() responses.
>> @@ -235,21 +242,19 @@ static void read_blocktime(QTestState *who)
>> qobject_unref(rsp_return);
>> }
>>
>> +/*
>> + * Wait for two changes in the migration pass count, but bail if we stop.
>> + */
>> static void wait_for_migration_pass(QTestState *who)
>> {
>> - uint64_t initial_pass = get_migration_pass(who);
>> - uint64_t pass;
>> + uint64_t pass, prev_pass = 0, changes = 0;
>>
>> - /* Wait for the 1st sync */
>> - while (!got_src_stop && !initial_pass) {
>> - usleep(1000);
>> - initial_pass = get_migration_pass(who);
>> - }
>> -
>> - do {
>> + while (changes < 2 && !src_state.stop_seen) {
>> usleep(1000);
>> pass = get_migration_pass(who);
>> - } while (pass == initial_pass && !got_src_stop);
>> + changes += (pass != prev_pass);
>> + prev_pass = pass;
>> + }
>
> Here won't it start to wait for 2 iterations every time instead of 1?
>
> Note that previously we only wait for 1 iteration as long as not the
> initial pass.
I don't think so. Both the old and new code require at least a transition from
pass 0 to 1, and pass 1 to 2, to return. With the old:
when initial_pass becomes non-zero, done with first loop
when pass changes again, done with 2nd loop
- Steve
> And I think the change will double the counts for below..
>
> while (args->iterations > 1) {
> wait_for_migration_pass(from);
> args->iterations--;
> }
>
> The event-related changes are all fine, but maybe leave this piece as before?
>
>> }
>>
>> static void check_guests_ram(QTestState *who)
>> @@ -586,10 +591,7 @@ static void migrate_postcopy_start(QTestState *from, QTestState *to)
>> {
>> qtest_qmp_assert_success(from, "{ 'execute': 'migrate-start-postcopy' }");
>>
>> - if (!got_src_stop) {
>> - qtest_qmp_eventwait(from, "STOP");
>> - }
>> -
>> + wait_for_stop(from, &src_state);
>> qtest_qmp_eventwait(to, "RESUME");
>> }
>>
>> @@ -720,8 +722,9 @@ static int test_migrate_start(QTestState **from, QTestState **to,
>> }
>> }
>>
>> - got_src_stop = false;
>> - got_dst_resume = false;
>> + dst_state = (QTestMigrationState) { };
>> + src_state = (QTestMigrationState) { };
>> +
>> bootpath = g_strdup_printf("%s/bootsect", tmpfs);
>> if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
>> /* the assembled x86 boot sector should be exactly one sector large */
>> @@ -801,8 +804,8 @@ static int test_migrate_start(QTestState **from, QTestState **to,
>> if (!args->only_target) {
>> *from = qtest_init(cmd_source);
>> qtest_qmp_set_event_callback(*from,
>> - migrate_watch_for_stop,
>> - &got_src_stop);
>> + migrate_watch_for_events,
>> + &src_state);
>> }
>>
>> cmd_target = g_strdup_printf("-accel kvm%s -accel tcg "
>> @@ -821,8 +824,8 @@ static int test_migrate_start(QTestState **from, QTestState **to,
>> ignore_stderr);
>> *to = qtest_init(cmd_target);
>> qtest_qmp_set_event_callback(*to,
>> - migrate_watch_for_resume,
>> - &got_dst_resume);
>> + migrate_watch_for_events,
>> + &dst_state);
>>
>> /*
>> * Remove shmem file immediately to avoid memory leak in test failed case.
>> @@ -1516,9 +1519,7 @@ static void test_precopy_common(MigrateCommon *args)
>> */
>> if (args->result == MIG_TEST_SUCCEED) {
>> qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}");
>> - if (!got_src_stop) {
>> - qtest_qmp_eventwait(from, "STOP");
>> - }
>> + wait_for_stop(from, &src_state);
>> migrate_ensure_converge(from);
>> }
>> }
>> @@ -1560,9 +1561,8 @@ static void test_precopy_common(MigrateCommon *args)
>> */
>> wait_for_migration_complete(from);
>>
>> - if (!got_src_stop) {
>> - qtest_qmp_eventwait(from, "STOP");
>> - }
>> + wait_for_stop(from, &src_state);
>> +
>> } else {
>> wait_for_migration_complete(from);
>> /*
>> @@ -1575,7 +1575,7 @@ static void test_precopy_common(MigrateCommon *args)
>> qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}");
>> }
>>
>> - if (!got_dst_resume) {
>> + if (!dst_state.resume_seen) {
>> qtest_qmp_eventwait(to, "RESUME");
>> }
>>
>> @@ -1696,9 +1696,7 @@ static void test_ignore_shared(void)
>>
>> migrate_wait_for_dirty_mem(from, to);
>>
>> - if (!got_src_stop) {
>> - qtest_qmp_eventwait(from, "STOP");
>> - }
>> + wait_for_stop(from, &src_state);
>>
>> qtest_qmp_eventwait(to, "RESUME");
>>
>> @@ -2139,7 +2137,7 @@ static void test_migrate_auto_converge(void)
>> break;
>> }
>> usleep(20);
>> - g_assert_false(got_src_stop);
>> + g_assert_false(src_state.stop_seen);
>> } while (true);
>> /* The first percentage of throttling should be at least init_pct */
>> g_assert_cmpint(percentage, >=, init_pct);
>> @@ -2481,9 +2479,7 @@ static void test_multifd_tcp_cancel(void)
>>
>> migrate_ensure_converge(from);
>>
>> - if (!got_src_stop) {
>> - qtest_qmp_eventwait(from, "STOP");
>> - }
>> + wait_for_stop(from, &src_state);
>> qtest_qmp_eventwait(to2, "RESUME");
>>
>> wait_for_serial("dest_serial");
>> --
>> 1.8.3.1
>>
>
next prev parent reply other threads:[~2023-11-13 18:33 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-29 18:17 [PATCH V4 00/11] fix migration of suspended runstate Steve Sistare
2023-08-29 18:17 ` [PATCH V4 01/11] cpus: pass runstate to vm_prepare_start Steve Sistare
2023-08-30 15:52 ` Peter Xu
2023-08-30 15:56 ` Steven Sistare
2023-08-29 18:17 ` [PATCH V4 02/11] migration: preserve suspended runstate Steve Sistare
2023-08-30 16:07 ` Peter Xu
2023-08-29 18:17 ` [PATCH V4 03/11] migration: add runstate function Steve Sistare
2023-08-30 16:11 ` Peter Xu
2023-08-29 18:17 ` [PATCH V4 04/11] migration: preserve suspended for snapshot Steve Sistare
2023-08-30 16:22 ` Peter Xu
2023-11-13 18:32 ` Steven Sistare
2023-08-29 18:18 ` [PATCH V4 05/11] migration: preserve suspended for bg_migration Steve Sistare
2023-08-30 16:35 ` Peter Xu
2023-11-13 18:32 ` Steven Sistare
2023-08-29 18:18 ` [PATCH V4 06/11] migration: preserve cpu ticks if suspended Steve Sistare
2023-08-30 16:47 ` Peter Xu
2023-09-07 15:50 ` Steven Sistare
2023-11-13 18:32 ` Steven Sistare
2023-08-29 18:18 ` [PATCH V4 07/11] tests/qtest: migration events Steve Sistare
2023-08-30 17:00 ` Peter Xu
2023-11-13 18:33 ` Steven Sistare [this message]
2023-11-13 19:20 ` Steven Sistare
2023-08-29 18:18 ` [PATCH V4 08/11] tests/qtest: option to suspend during migration Steve Sistare
2023-08-30 17:01 ` Peter Xu
2023-08-29 18:18 ` [PATCH V4 09/11] tests/qtest: precopy migration with suspend Steve Sistare
2023-08-29 18:18 ` [PATCH V4 10/11] tests/qtest: postcopy " Steve Sistare
2023-08-29 18:18 ` [PATCH V4 11/11] tests/qtest: background " Steve Sistare
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=f42c8267-5885-442d-a2dd-a57a77d5efe1@oracle.com \
--to=steven.sistare@oracle.com \
--cc=berrange@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=thuth@redhat.com \
/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).