From: Steve Sistare <steven.sistare@oracle.com>
To: qemu-devel@nongnu.org
Cc: "Juan Quintela" <quintela@redhat.com>,
"Peter Xu" <peterx@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Steve Sistare" <steven.sistare@oracle.com>
Subject: [PATCH V4 02/11] migration: preserve suspended runstate
Date: Tue, 29 Aug 2023 11:17:57 -0700 [thread overview]
Message-ID: <1693333086-392798-3-git-send-email-steven.sistare@oracle.com> (raw)
In-Reply-To: <1693333086-392798-1-git-send-email-steven.sistare@oracle.com>
A guest that is migrated in the suspended state automaticaly wakes and
continues execution. This is wrong; the guest should end migration in
the same state it started. The root cause is that the outgoing migration
code automatically wakes the guest, then saves the RUNNING runstate in
global_state_store(), hence the incoming migration code thinks the guest is
running and continues the guest if autostart is true.
On the outgoing side, do not call qemu_system_wakeup_request().
On the incoming side for precopy, prepare to start the vm, but do not
yet start it. A future system_wakeup will cause the main loop to resume
the VCPUs.
On the incoming side for postcopy, do not wake the guest, and apply the
the same logic as found in precopy: if autostart and the runstate is
RUNNING, then vm_start, else prepare to start the vm.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
---
migration/migration.c | 4 ++--
migration/savevm.c | 15 ++++++++++-----
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 5528acb..5bcc761 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -496,6 +496,8 @@ static void process_incoming_migration_bh(void *opaque)
} else if (migration_incoming_colo_enabled()) {
migration_incoming_disable_colo();
vm_start();
+ } else if (global_state_get_runstate() == RUN_STATE_SUSPENDED) {
+ vm_prepare_start(false, global_state_get_runstate());
} else {
runstate_set(global_state_get_runstate());
}
@@ -2109,7 +2111,6 @@ static int postcopy_start(MigrationState *ms, Error **errp)
qemu_mutex_lock_iothread();
trace_postcopy_start_set_run();
- qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL);
global_state_store();
ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
if (ret < 0) {
@@ -2315,7 +2316,6 @@ static void migration_completion(MigrationState *s)
if (s->state == MIGRATION_STATUS_ACTIVE) {
qemu_mutex_lock_iothread();
s->downtime_start = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
- qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL);
s->vm_old_state = runstate_get();
global_state_store();
diff --git a/migration/savevm.c b/migration/savevm.c
index a2cb885..bae0a1a 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2070,12 +2070,17 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
dirty_bitmap_mig_before_vm_start();
- if (autostart) {
- /* Hold onto your hats, starting the CPU */
- vm_start();
+ if (!global_state_received() ||
+ global_state_get_runstate() == RUN_STATE_RUNNING) {
+ if (autostart) {
+ vm_start();
+ } else {
+ runstate_set(RUN_STATE_PAUSED);
+ }
+ } else if (global_state_get_runstate() == RUN_STATE_SUSPENDED) {
+ vm_prepare_start(false, RUN_STATE_SUSPENDED);
} else {
- /* leave it paused and let management decide when to start the CPU */
- runstate_set(RUN_STATE_PAUSED);
+ runstate_set(global_state_get_runstate());
}
qemu_bh_delete(mis->bh);
--
1.8.3.1
next prev parent reply other threads:[~2023-08-29 23:14 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 ` Steve Sistare [this message]
2023-08-30 16:07 ` [PATCH V4 02/11] migration: preserve suspended runstate 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
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=1693333086-392798-3-git-send-email-steven.sistare@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).