From: Markus Armbruster <armbru@redhat.com>
To: Steven Sistare <steven.sistare@oracle.com>
Cc: qemu-devel@nongnu.org, "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>,
"Fabiano Rosas" <farosas@suse.de>,
"Leonardo Bras" <leobras@redhat.com>,
"Eric Blake" <eblake@redhat.com>
Subject: Re: [PATCH V6 03/14] cpus: stop vm in suspended runstate
Date: Sat, 23 Dec 2023 06:41:45 +0100 [thread overview]
Message-ID: <87sf3ta31i.fsf@pond.sub.org> (raw)
In-Reply-To: <9d613137-24aa-4323-aee1-0d38b91339c5@oracle.com> (Steven Sistare's message of "Fri, 22 Dec 2023 10:53:24 -0500")
Steven Sistare <steven.sistare@oracle.com> writes:
> On 12/22/2023 7:20 AM, Markus Armbruster wrote:
>> Steve Sistare <steven.sistare@oracle.com> writes:
>>
>>> Currently, a vm in the suspended state is not completely stopped. The VCPUs
>>> have been paused, but the cpu clock still runs, and runstate notifiers for
>>> the transition to stopped have not been called. This causes problems for
>>> live migration. Stale cpu timers_state is saved to the migration stream,
>>> causing time errors in the guest when it wakes from suspend, and state that
>>> would have been modified by runstate notifiers is wrong.
>>>
>>> Modify vm_stop to completely stop the vm if the current state is suspended,
>>> transition to RUN_STATE_PAUSED, and remember that the machine was suspended.
>>> Modify vm_start to restore the suspended state.
>>
>> Can you explain this to me in terms of the @current_run_state state
>> machine? Like
>>
>> Before the patch, trigger X in state Y goes to state Z.
>> Afterwards, it goes to ...
>
> Old behavior:
> RUN_STATE_SUSPENDED --> stop --> RUN_STATE_SUSPENDED
>
> New behavior:
> RUN_STATE_SUSPENDED --> stop --> RUN_STATE_PAUSED
> RUN_STATE_PAUSED --> cont --> RUN_STATE_SUSPENDED
This clarifies things quite a bit for me. Maybe work it into the commit
message?
>>> This affects all callers of vm_stop and vm_start, notably, the qapi stop and
>>> cont commands. For example:
>>>
>>> (qemu) info status
>>> VM status: paused (suspended)
>>>
>>> (qemu) stop
>>> (qemu) info status
>>> VM status: paused
>>>
>>> (qemu) cont
>>> (qemu) info status
>>> VM status: paused (suspended)
>>>
>>> (qemu) system_wakeup
>>> (qemu) info status
>>> VM status: running
>>>
>>> Suggested-by: Peter Xu <peterx@redhat.com>
>>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>>> ---
>>> include/sysemu/runstate.h | 5 +++++
>>> qapi/misc.json | 10 ++++++++--
>>> system/cpus.c | 19 ++++++++++++++-----
>>> system/runstate.c | 3 +++
>>> 4 files changed, 30 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h
>>> index f6a337b..1d6828f 100644
>>> --- a/include/sysemu/runstate.h
>>> +++ b/include/sysemu/runstate.h
>>> @@ -40,6 +40,11 @@ static inline bool shutdown_caused_by_guest(ShutdownCause cause)
>>> return cause >= SHUTDOWN_CAUSE_GUEST_SHUTDOWN;
>>> }
>>>
>>> +static inline bool runstate_is_started(RunState state)
>>> +{
>>> + return state == RUN_STATE_RUNNING || state == RUN_STATE_SUSPENDED;
>>> +}
>>> +
>>> void vm_start(void);
>>>
>>> /**
>>> diff --git a/qapi/misc.json b/qapi/misc.json
>>> index cda2eff..efb8d44 100644
>>> --- a/qapi/misc.json
>>> +++ b/qapi/misc.json
>>> @@ -134,7 +134,7 @@
>>> ##
>>> # @stop:
>>> #
>>> -# Stop all guest VCPU execution.
>>> +# Stop all guest VCPU and VM execution.
>>
>> Doesn't "stop all VM execution" imply "stop all guest vCPU execution"?
>
> Agreed, so we simply have:
>
> # @stop:
> # Stop guest VM execution.
>
> # @cont:
> # Resume guest VM execution.
Yes, please.
>>> #
>>> # Since: 0.14
>>> #
>>> @@ -143,6 +143,9 @@
>> # Notes: This function will succeed even if the guest is already in
>> # the stopped state. In "inmigrate" state, it will ensure that
>>> # the guest remains paused once migration finishes, as if the -S
>>> # option was passed on the command line.
>>> #
>>> +# In the "suspended" state, it will completely stop the VM and
>>> +# cause a transition to the "paused" state. (Since 9.0)
>>> +#
>>
>> What user-observable (with query-status) state transitions are possible
>> here?
>
> {"status": "suspended", "singlestep": false, "running": false}
> --> stop -->
> {"status": "paused", "singlestep": false, "running": false}
>
>>> # Example:
>>> #
>>> # -> { "execute": "stop" }
>>> @@ -153,7 +156,7 @@
>>> ##
>>> # @cont:
>>> #
>>> -# Resume guest VCPU execution.
>>> +# Resume guest VCPU and VM execution.
>>> #
>>> # Since: 0.14
>>> #
>>> @@ -165,6 +168,9 @@
>> # Returns: If successful, nothing
>> #
>> # Notes: This command will succeed if the guest is currently running.
>> # It will also succeed if the guest is in the "inmigrate" state;
>> # in this case, the effect of the command is to make sure the
>>> # guest starts once migration finishes, removing the effect of the
>>> # -S command line option if it was passed.
>>> #
>>> +# If the VM was previously suspended, and not been reset or woken,
>>> +# this command will transition back to the "suspended" state. (Since 9.0)
>>
>> Long line.
>
> It fits in 80 columns, but perhaps this looks nicer:
>
> # If the VM was previously suspended, and not been reset or woken,
> # this command will transition back to the "suspended" state.
> # (Since 9.0)
It does :)
docs/devel/qapi-code-gen.rst section "Documentation markup":
For legibility, wrap text paragraphs so every line is at most 70
characters long.
>> What user-observable state transitions are possible here?
>
> {"status": "paused", "singlestep": false, "running": false}
> --> cont -->
> {"status": "suspended", "singlestep": false, "running": false}
>
>>> +#
>>> # Example:
>>> #
>>> # -> { "execute": "cont" }
>>
>> Should we update documentation of query-status, too?
>
> IMO no. The new behavior changes the status/RunState field only, and the
> domain of values does not change, only the transitions caused by the commands
> described here.
I see.
But if we change the stop's and cont's description from "guest VCPU
execution" to "guest VM execution", maybe we want to change
query-status's from "Information about VCPU run state" to "Information
about VM run state.
> - Steve
>
>> ##
>> # @StatusInfo:
>> #
>> # Information about VCPU run state
>> #
>> # @running: true if all VCPUs are runnable, false if not runnable
>> #
>> # @singlestep: true if using TCG with one guest instruction per
>> # translation block
>> #
>> # @status: the virtual machine @RunState
>> #
>> # Features:
>> #
>> # @deprecated: Member 'singlestep' is deprecated (with no
>> # replacement).
>> #
>> # Since: 0.14
>> #
>> # Notes: @singlestep is enabled on the command line with '-accel
>> # tcg,one-insn-per-tb=on', or with the HMP 'one-insn-per-tb'
>> # command.
>> ##
>> { 'struct': 'StatusInfo',
>> 'data': {'running': 'bool',
>> 'singlestep': { 'type': 'bool', 'features': [ 'deprecated' ]},
>> 'status': 'RunState'} }
>>
>> ##
>> # @query-status:
>> #
>> # Query the run status of all VCPUs
>> #
>> # Returns: @StatusInfo reflecting all VCPUs
>> #
>> # Since: 0.14
>> #
>> # Example:
>> #
>> # -> { "execute": "query-status" }
>> # <- { "return": { "running": true,
>> # "singlestep": false,
>> # "status": "running" } }
>> ##
>> { 'command': 'query-status', 'returns': 'StatusInfo',
>> 'allow-preconfig': true }
>>
>> [...]
next prev parent reply other threads:[~2023-12-23 5:43 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-30 21:37 [PATCH V6 00/14] fix migration of suspended runstate Steve Sistare
2023-11-30 21:37 ` [PATCH V6 01/14] cpus: pass runstate to vm_prepare_start Steve Sistare
2023-11-30 21:37 ` [PATCH V6 02/14] cpus: vm_was_suspended Steve Sistare
2023-11-30 22:03 ` Peter Xu
2023-11-30 21:37 ` [PATCH V6 03/14] cpus: stop vm in suspended runstate Steve Sistare
2023-11-30 22:10 ` Peter Xu
2023-12-01 17:11 ` Steven Sistare
2023-12-04 16:35 ` Peter Xu
2023-12-04 16:41 ` Steven Sistare
2023-12-22 12:20 ` Markus Armbruster
2023-12-22 15:53 ` Steven Sistare
2023-12-23 5:41 ` Markus Armbruster [this message]
2024-01-03 13:09 ` Peter Xu
2024-01-03 13:32 ` Steven Sistare
2024-01-03 14:47 ` Steven Sistare
2024-01-08 7:43 ` Markus Armbruster
2023-11-30 21:37 ` [PATCH V6 04/14] cpus: vm_resume Steve Sistare
2023-12-05 21:36 ` Peter Xu
2023-11-30 21:37 ` [PATCH V6 05/14] migration: propagate suspended runstate Steve Sistare
2023-11-30 23:06 ` Peter Xu
2023-12-01 16:23 ` Steven Sistare
2023-12-04 17:24 ` Peter Xu
2023-12-04 19:31 ` Fabiano Rosas
2023-12-04 20:02 ` Peter Xu
2023-12-04 21:09 ` Fabiano Rosas
2023-12-04 22:04 ` Peter Xu
2023-12-05 12:44 ` Fabiano Rosas
2023-12-05 14:14 ` Steven Sistare
2023-12-05 16:18 ` Peter Xu
2023-12-05 16:52 ` Fabiano Rosas
2023-12-05 17:04 ` Steven Sistare
2023-12-04 22:23 ` Steven Sistare
2023-12-05 16:50 ` Peter Xu
2023-12-05 17:48 ` Steven Sistare
2023-11-30 21:37 ` [PATCH V6 06/14] migration: preserve " Steve Sistare
2023-12-05 21:34 ` Peter Xu
2023-11-30 21:37 ` [PATCH V6 07/14] migration: preserve suspended for snapshot Steve Sistare
2023-12-05 21:35 ` Peter Xu
2023-11-30 21:37 ` [PATCH V6 08/14] migration: preserve suspended for bg_migration Steve Sistare
2023-12-05 21:35 ` Peter Xu
2023-11-30 21:37 ` [PATCH V6 09/14] tests/qtest: migration events Steve Sistare
2023-11-30 21:37 ` [PATCH V6 10/14] tests/qtest: option to suspend during migration Steve Sistare
2023-12-04 21:14 ` Fabiano Rosas
2023-11-30 21:37 ` [PATCH V6 11/14] tests/qtest: precopy migration with suspend Steve Sistare
2023-12-04 20:49 ` Peter Xu
2023-12-05 16:14 ` Steven Sistare
2023-12-05 21:07 ` Peter Xu
2023-11-30 21:37 ` [PATCH V6 12/14] tests/qtest: postcopy " Steve Sistare
2023-11-30 21:37 ` [PATCH V6 13/14] tests/qtest: bootfile per vm Steve Sistare
2023-12-04 21:13 ` Fabiano Rosas
2023-12-04 22:37 ` Peter Xu
2023-12-05 18:43 ` Steven Sistare
2023-11-30 21:37 ` [PATCH V6 14/14] tests/qtest: background migration with suspend Steve Sistare
2023-12-04 21:14 ` Fabiano Rosas
2023-12-05 18:52 ` [PATCH V6 00/14] fix migration of suspended runstate Steven Sistare
2023-12-05 19:19 ` Fabiano Rosas
2023-12-05 21:37 ` Peter Xu
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=87sf3ta31i.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=farosas@suse.de \
--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.