From: peterx@redhat.com
To: qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Cc: Fabiano Rosas <farosas@suse.de>,
Steve Sistare <steven.sistare@oracle.com>,
Juan Quintela <quintela@trasno.org>,
peterx@redhat.com,
Leonardo Bras Soares Passos <lsoaresp@redhat.com>,
Avihai Horon <avihaih@nvidia.com>
Subject: [PULL 08/26] migration: preserve suspended runstate
Date: Thu, 4 Jan 2024 12:31:53 +0800 [thread overview]
Message-ID: <20240104043213.431566-9-peterx@redhat.com> (raw)
In-Reply-To: <20240104043213.431566-1-peterx@redhat.com>
From: Steve Sistare <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>
Link: https://lore.kernel.org/r/1704312341-66640-7-git-send-email-steven.sistare@oracle.com
Signed-off-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 3ce04b2aaf..8124811045 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();
}
--
2.41.0
next prev parent reply other threads:[~2024-01-04 4:33 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-04 4:31 [PULL 00/26] Migration 20240104 patches peterx
2024-01-04 4:31 ` [PULL 01/26] MAINTAINERS: Leaving Migration peterx
2024-01-04 4:31 ` [PULL 02/26] MAINTAINERS: Remove myself as reviewer from Live Migration peterx
2024-01-04 4:31 ` [PULL 03/26] cpus: vm_was_suspended peterx
2024-01-04 4:31 ` [PULL 04/26] cpus: stop vm in suspended runstate peterx
2024-01-04 4:31 ` [PULL 05/26] cpus: check running not RUN_STATE_RUNNING peterx
2024-01-04 4:31 ` [PULL 06/26] cpus: vm_resume peterx
2024-01-04 4:31 ` [PULL 07/26] migration: propagate suspended runstate peterx
2024-01-04 4:31 ` peterx [this message]
2024-01-04 4:31 ` [PULL 09/26] migration: preserve suspended for snapshot peterx
2024-01-04 4:31 ` [PULL 10/26] migration: preserve suspended for bg_migration peterx
2024-01-04 4:31 ` [PULL 11/26] tests/qtest: migration events peterx
2024-01-04 4:31 ` [PULL 12/26] tests/qtest: option to suspend during migration peterx
2024-01-04 4:31 ` [PULL 13/26] tests/qtest: precopy migration with suspend peterx
2024-01-04 4:31 ` [PULL 14/26] tests/qtest: postcopy " peterx
2024-01-04 4:32 ` [PULL 15/26] migration: Remove migrate_max_downtime() declaration peterx
2024-01-04 4:32 ` [PULL 16/26] migration: Remove nulling of hostname in migrate_init() peterx
2024-01-04 4:32 ` [PULL 17/26] migration: Refactor migration_incoming_setup() peterx
2024-01-04 4:32 ` [PULL 18/26] migration: Remove errp parameter in migration_fd_process_incoming() peterx
2024-01-04 4:32 ` [PULL 19/26] migration/multifd: Fix error message in multifd_recv_initial_packet() peterx
2024-01-04 4:32 ` [PULL 20/26] migration/multifd: Simplify multifd_channel_connect() if else statement peterx
2024-01-04 4:32 ` [PULL 21/26] migration/multifd: Fix leaking of Error in TLS error flow peterx
2024-01-04 4:32 ` [PULL 22/26] migration/multifd: Remove error_setg() in migration_ioc_process_incoming() peterx
2024-01-04 4:32 ` [PULL 23/26] migration: Fix migration_channel_read_peek() error path peterx
2024-01-04 4:32 ` [PULL 24/26] migration: Remove unnecessary usage of local Error peterx
2024-01-04 4:32 ` [PULL 25/26] migration/multifd: " peterx
2024-01-04 4:32 ` [PULL 26/26] migration: fix coverity migrate_mode finding peterx
2024-01-05 16:08 ` [PULL 00/26] Migration 20240104 patches Peter Maydell
2024-01-07 12:33 ` Peter Xu
2024-01-07 12:41 ` Stefan Hajnoczi
2024-01-07 15:23 ` Peter Maydell
2024-01-07 16:28 ` Stefan Hajnoczi
2024-01-08 2:10 ` Peter Xu
2024-01-08 2:34 ` Peter Xu
2024-01-08 15:22 ` Peter Maydell
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=20240104043213.431566-9-peterx@redhat.com \
--to=peterx@redhat.com \
--cc=avihaih@nvidia.com \
--cc=farosas@suse.de \
--cc=lsoaresp@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@trasno.org \
--cc=stefanha@redhat.com \
--cc=steven.sistare@oracle.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).