From: Fabiano Rosas <farosas@suse.de>
To: Steve Sistare <steven.sistare@oracle.com>, 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>,
"Leonardo Bras" <leobras@redhat.com>,
"Steve Sistare" <steven.sistare@oracle.com>
Subject: Re: [PATCH V7 05/12] migration: propagate suspended runstate
Date: Fri, 08 Dec 2023 13:37:12 -0300 [thread overview]
Message-ID: <87wmtoy7k7.fsf@suse.de> (raw)
In-Reply-To: <1701883417-356268-6-git-send-email-steven.sistare@oracle.com>
Steve Sistare <steven.sistare@oracle.com> writes:
> If the outgoing machine was previously suspended, propagate that to the
> incoming side via global_state, so a subsequent vm_start restores the
> suspended state. To maintain backward and forward compatibility, reclaim
> some space from the runstate member.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> ---
> migration/global_state.c | 35 +++++++++++++++++++++++++++++++++--
> 1 file changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/migration/global_state.c b/migration/global_state.c
> index 4e2a9d8..d4f61a1 100644
> --- a/migration/global_state.c
> +++ b/migration/global_state.c
> @@ -22,7 +22,16 @@
>
> typedef struct {
> uint32_t size;
> - uint8_t runstate[100];
> +
> + /*
> + * runstate was 100 bytes, zero padded, but we trimmed it to add a
> + * few fields and maintain backwards compatibility.
> + */
> + uint8_t runstate[32];
> + uint8_t has_vm_was_suspended;
> + uint8_t vm_was_suspended;
> + uint8_t unused[66];
> +
> RunState state;
> bool received;
> } GlobalState;
> @@ -35,6 +44,10 @@ static void global_state_do_store(RunState state)
> assert(strlen(state_str) < sizeof(global_state.runstate));
> strpadcpy((char *)global_state.runstate, sizeof(global_state.runstate),
> state_str, '\0');
> + global_state.has_vm_was_suspended = true;
> + global_state.vm_was_suspended = vm_get_suspended();
> +
> + memset(global_state.unused, 0, sizeof(global_state.unused));
> }
>
> void global_state_store(void)
> @@ -68,6 +81,12 @@ static bool global_state_needed(void *opaque)
> return true;
> }
>
> + /* If the suspended state must be remembered, it is needed */
> +
> + if (vm_get_suspended()) {
> + return true;
> + }
> +
> /* If state is running or paused, it is not needed */
>
> if (strcmp(runstate, "running") == 0 ||
> @@ -85,6 +104,7 @@ static int global_state_post_load(void *opaque, int version_id)
> Error *local_err = NULL;
> int r;
> char *runstate = (char *)s->runstate;
> + bool vm_was_suspended = s->has_vm_was_suspended && s->vm_was_suspended;
Why do you need has_vm_was_suspended? If they're always read like this,
then one flag should do, no?
>
> s->received = true;
> trace_migrate_global_state_post_load(runstate);
> @@ -93,7 +113,7 @@ static int global_state_post_load(void *opaque, int version_id)
> sizeof(s->runstate)) == sizeof(s->runstate)) {
> /*
> * This condition should never happen during migration, because
> - * all runstate names are shorter than 100 bytes (the size of
> + * all runstate names are shorter than 32 bytes (the size of
> * s->runstate). However, a malicious stream could overflow
> * the qapi_enum_parse() call, so we force the last character
> * to a NUL byte.
> @@ -110,6 +130,14 @@ static int global_state_post_load(void *opaque, int version_id)
> }
> s->state = r;
>
> + /*
> + * global_state is saved on the outgoing side before forcing a stopped
> + * state, so it may have saved state=suspended and vm_was_suspended=0.
> + * Now we are in a paused state, and when we later call vm_start, it must
> + * restore the suspended state, so we must set vm_was_suspended=1 here.
> + */
> + vm_set_suspended(vm_was_suspended || r == RUN_STATE_SUSPENDED);
> +
> return 0;
> }
>
> @@ -134,6 +162,9 @@ static const VMStateDescription vmstate_globalstate = {
> .fields = (VMStateField[]) {
> VMSTATE_UINT32(size, GlobalState),
> VMSTATE_BUFFER(runstate, GlobalState),
> + VMSTATE_UINT8(has_vm_was_suspended, GlobalState),
> + VMSTATE_UINT8(vm_was_suspended, GlobalState),
> + VMSTATE_BUFFER(unused, GlobalState),
> VMSTATE_END_OF_LIST()
> },
> };
next prev parent reply other threads:[~2023-12-08 16:38 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-06 17:23 [PATCH V7 00/12] fix migration of suspended runstate Steve Sistare
2023-12-06 17:23 ` [PATCH V7 01/12] cpus: vm_was_suspended Steve Sistare
2023-12-06 17:23 ` [PATCH V7 02/12] cpus: stop vm in suspended runstate Steve Sistare
2023-12-06 18:45 ` Philippe Mathieu-Daudé
2023-12-06 19:19 ` Steven Sistare
2023-12-06 20:48 ` Philippe Mathieu-Daudé
2023-12-06 21:09 ` Philippe Mathieu-Daudé
2023-12-11 6:25 ` Peter Xu
2023-12-11 13:37 ` Steven Sistare
2023-12-06 17:23 ` [PATCH V7 03/12] cpus: check running not RUN_STATE_RUNNING Steve Sistare
2023-12-06 17:23 ` [PATCH V7 04/12] cpus: vm_resume Steve Sistare
2023-12-06 17:23 ` [PATCH V7 05/12] migration: propagate suspended runstate Steve Sistare
2023-12-08 16:37 ` Fabiano Rosas [this message]
2023-12-08 17:28 ` Steven Sistare
2023-12-11 6:46 ` Peter Xu
2023-12-11 13:23 ` Steven Sistare
2023-12-06 17:23 ` [PATCH V7 06/12] migration: preserve " Steve Sistare
2023-12-06 17:23 ` [PATCH V7 07/12] migration: preserve suspended for snapshot Steve Sistare
2023-12-06 17:23 ` [PATCH V7 08/12] migration: preserve suspended for bg_migration Steve Sistare
2023-12-06 17:23 ` [PATCH V7 09/12] tests/qtest: migration events Steve Sistare
2023-12-06 17:23 ` [PATCH V7 10/12] tests/qtest: option to suspend during migration Steve Sistare
2023-12-06 17:23 ` [PATCH V7 11/12] tests/qtest: precopy migration with suspend Steve Sistare
2023-12-08 16:37 ` Fabiano Rosas
2023-12-11 6:54 ` Peter Xu
2023-12-06 17:23 ` [PATCH V7 12/12] tests/qtest: postcopy " Steve Sistare
2023-12-11 6:54 ` Peter Xu
2023-12-06 17:30 ` [PATCH V7 00/12] fix migration of suspended runstate Steven Sistare
2023-12-11 6:56 ` Peter Xu
2023-12-11 13:31 ` Steven Sistare
2023-12-12 8:54 ` Peter Xu
-- strict thread matches above, loose matches on Subject: below --
2023-12-06 17:12 Steve Sistare
2023-12-06 17:12 ` [PATCH V7 05/12] migration: propagate " 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=87wmtoy7k7.fsf@suse.de \
--to=farosas@suse.de \
--cc=berrange@redhat.com \
--cc=leobras@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=steven.sistare@oracle.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.