From: Paolo Bonzini <pbonzini@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1.7] timers: fix stop/cont with -icount
Date: Wed, 06 Nov 2013 15:42:48 +0100 [thread overview]
Message-ID: <527A5568.5080707@redhat.com> (raw)
In-Reply-To: <1382977938-13844-1-git-send-email-pbonzini@redhat.com>
Il 28/10/2013 17:32, Paolo Bonzini ha scritto:
> Stop/cont commands are broken with -icount due to a deadlock. The
> real problem is that the computation of timers_state.cpu_ticks_offset
> makes no sense with -icount enabled: we set it to an icount clock value
> in cpu_disable_ticks, and subtract a TSC (or similar, whatever
> cpu_get_real_ticks happens to return) value in cpu_enable_ticks.
>
> The fix is simple. timers_state.cpu_ticks_offset is only used
> together with cpu_get_real_ticks, so we can use cpu_get_real_ticks
> in cpu_disable_ticks. There is no need to update cpu_ticks_prev
> at the time cpu_disable_ticks is called; instead, we can do it
> the next time cpu_get_ticks is called.
>
> The change to cpu_disable_ticks is the important part of the patch.
> The rest modifies the code to always check timers_state.cpu_ticks_prev,
> even when the ticks are not advancing (i.e. the VM is stopped). It also
> makes a similar change to cpu_get_clock_locked, so that the code remains
> similar for cpu_get_ticks and cpu_get_clock_locked.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> cpus.c | 42 ++++++++++++++++++++++--------------------
> 1 file changed, 22 insertions(+), 20 deletions(-)
>
> diff --git a/cpus.c b/cpus.c
> index 398229e..c2c6864 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -165,36 +165,38 @@ int64_t cpu_get_icount(void)
> /* Caller must hold the BQL */
> int64_t cpu_get_ticks(void)
> {
> + int64_t ticks;
> +
> if (use_icount) {
> return cpu_get_icount();
> }
> - if (!timers_state.cpu_ticks_enabled) {
> - return timers_state.cpu_ticks_offset;
> - } else {
> - int64_t ticks;
> - ticks = cpu_get_real_ticks();
> - if (timers_state.cpu_ticks_prev > ticks) {
> - /* Note: non increasing ticks may happen if the host uses
> - software suspend */
> - timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
> - }
> - timers_state.cpu_ticks_prev = ticks;
> - return ticks + timers_state.cpu_ticks_offset;
> +
> + ticks = timers_state.cpu_ticks_offset;
> + if (timers_state.cpu_ticks_enabled) {
> + ticks += cpu_get_real_ticks();
> + }
> +
> + if (timers_state.cpu_ticks_prev > ticks) {
> + /* Note: non increasing ticks may happen if the host uses
> + software suspend */
> + timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
> + ticks = timers_state.cpu_ticks_prev;
> }
> +
> + timers_state.cpu_ticks_prev = ticks;
> + return ticks;
> }
>
> static int64_t cpu_get_clock_locked(void)
> {
> - int64_t ti;
> + int64_t ticks;
>
> - if (!timers_state.cpu_ticks_enabled) {
> - ti = timers_state.cpu_clock_offset;
> - } else {
> - ti = get_clock();
> - ti += timers_state.cpu_clock_offset;
> + ticks = timers_state.cpu_clock_offset;
> + if (timers_state.cpu_ticks_enabled) {
> + ticks += get_clock();
> }
>
> - return ti;
> + return ticks;
> }
>
> /* return the host CPU monotonic timer and handle stop/restart */
> @@ -235,7 +237,7 @@ void cpu_disable_ticks(void)
> /* Here, the really thing protected by seqlock is cpu_clock_offset. */
> seqlock_write_lock(&timers_state.vm_clock_seqlock);
> if (timers_state.cpu_ticks_enabled) {
> - timers_state.cpu_ticks_offset = cpu_get_ticks();
> + timers_state.cpu_ticks_offset += cpu_get_real_ticks();
> timers_state.cpu_clock_offset = cpu_get_clock_locked();
> timers_state.cpu_ticks_enabled = 0;
> }
>
Ping, did you miss this one?
Paolo
prev parent reply other threads:[~2013-11-06 14:43 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-28 16:32 [Qemu-devel] [PATCH 1.7] timers: fix stop/cont with -icount Paolo Bonzini
2013-11-06 14:42 ` Paolo Bonzini [this message]
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=527A5568.5080707@redhat.com \
--to=pbonzini@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/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.