From: Steve Sistare <steven.sistare@oracle.com>
To: qemu-devel@nongnu.org
Cc: "Peter Xu" <peterx@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Fabiano Rosas" <farosas@suse.de>,
"Leonardo Bras" <leobras@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Anthony PERARD" <anthony.perard@citrix.com>,
"Stefan Berger" <stefanb@linux.vnet.ibm.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Paul Durrant" <paul@xen.org>, "Eric Blake" <eblake@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Steve Sistare" <steven.sistare@oracle.com>
Subject: [PATCH V9 06/12] migration: preserve suspended runstate
Date: Wed, 3 Jan 2024 12:05:35 -0800 [thread overview]
Message-ID: <1704312341-66640-7-git-send-email-steven.sistare@oracle.com> (raw)
In-Reply-To: <1704312341-66640-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, delete the call to qemu_system_wakeup_request().
Now that vm_stop completely stops a vm in the suspended state (from the
preceding patches), the existing call to vm_stop_force_state is sufficient
to correctly migrate all vmstate.
On the incoming side, call vm_start if the pre-migration state was running
or suspended. For the latter, vm_start correctly restores the suspended
state, and a future system_wakeup monitor request will cause the vm to
resume running.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 3ce04b2..8124811 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -604,7 +604,7 @@ static void process_incoming_migration_bh(void *opaque)
*/
if (!migrate_late_block_activate() ||
(autostart && (!global_state_received() ||
- global_state_get_runstate() == RUN_STATE_RUNNING))) {
+ runstate_is_live(global_state_get_runstate())))) {
/* Make sure all file formats throw away their mutable metadata.
* If we get an error here, just don't restart the VM yet. */
bdrv_activate_all(&local_err);
@@ -628,7 +628,7 @@ static void process_incoming_migration_bh(void *opaque)
dirty_bitmap_mig_before_vm_start();
if (!global_state_received() ||
- global_state_get_runstate() == RUN_STATE_RUNNING) {
+ runstate_is_live(global_state_get_runstate())) {
if (autostart) {
vm_start();
} else {
@@ -2416,7 +2416,6 @@ static int postcopy_start(MigrationState *ms, Error **errp)
migration_downtime_start(ms);
- qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL);
global_state_store();
ret = migration_stop_vm(RUN_STATE_FINISH_MIGRATE);
if (ret < 0) {
@@ -2615,7 +2614,6 @@ static int migration_completion_precopy(MigrationState *s,
qemu_mutex_lock_iothread();
migration_downtime_start(s);
- qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL);
s->vm_old_state = runstate_get();
global_state_store();
@@ -3136,7 +3134,7 @@ static void migration_iteration_finish(MigrationState *s)
case MIGRATION_STATUS_FAILED:
case MIGRATION_STATUS_CANCELLED:
case MIGRATION_STATUS_CANCELLING:
- if (s->vm_old_state == RUN_STATE_RUNNING) {
+ if (runstate_is_live(s->vm_old_state)) {
if (!runstate_check(RUN_STATE_SHUTDOWN)) {
vm_start();
}
--
1.8.3.1
next prev parent reply other threads:[~2024-01-03 20:07 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-03 20:05 [PATCH V9 00/12] fix migration of suspended runstate Steve Sistare
2024-01-03 20:05 ` [PATCH V9 01/12] cpus: vm_was_suspended Steve Sistare
2024-01-03 20:05 ` [PATCH V9 02/12] cpus: stop vm in suspended runstate Steve Sistare
2024-01-03 20:05 ` [PATCH V9 03/12] cpus: check running not RUN_STATE_RUNNING Steve Sistare
2024-01-03 20:05 ` [PATCH V9 04/12] cpus: vm_resume Steve Sistare
2024-01-03 20:05 ` [PATCH V9 05/12] migration: propagate suspended runstate Steve Sistare
2024-01-03 20:05 ` Steve Sistare [this message]
2024-01-03 20:05 ` [PATCH V9 07/12] migration: preserve suspended for snapshot Steve Sistare
2024-01-03 20:05 ` [PATCH V9 08/12] migration: preserve suspended for bg_migration Steve Sistare
2024-01-03 20:05 ` [PATCH V9 09/12] tests/qtest: migration events Steve Sistare
2024-01-03 20:05 ` [PATCH V9 10/12] tests/qtest: option to suspend during migration Steve Sistare
2024-01-03 20:05 ` [PATCH V9 11/12] tests/qtest: precopy migration with suspend Steve Sistare
2024-01-03 20:05 ` [PATCH V9 12/12] tests/qtest: postcopy " Steve Sistare
2024-01-04 4:37 ` [PATCH V9 00/12] fix migration of suspended runstate Peter Xu
2024-01-08 12:47 ` Markus Armbruster
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=1704312341-66640-7-git-send-email-steven.sistare@oracle.com \
--to=steven.sistare@oracle.com \
--cc=anthony.perard@citrix.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=farosas@suse.de \
--cc=kraxel@redhat.com \
--cc=leobras@redhat.com \
--cc=paul@xen.org \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=sstabellini@kernel.org \
--cc=stefanb@linux.vnet.ibm.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).