From: Kouya Shimura <kouya@jp.fujitsu.com>
To: Jan Beulich <JBeulich@suse.com>, xen-devel@lists.xen.org
Subject: [PATCH 2/2] x86/hvm: fix corrupt ACPI PM-Timer during live migration
Date: Thu, 21 Mar 2013 16:32:26 +0900 [thread overview]
Message-ID: <514AB78A.3010109@jp.fujitsu.com> (raw)
In-Reply-To: <514A9BC4.40508@jp.fujitsu.com>
The ACPI PM-Timer value is broken when a vm is saved.
The function pmtimer_save() calculates the value on its own,
but vcpu->arch.hvm_vcpu.guest_time is not valid (usually zero).
Another problem is a double counting of the PM-Timer value
in failure to save a vm.
This patch corrects the value, and also makes the calculation
more precise.
Signed-off-by: Kouya Shimura <kouya@jp.fujitsu.com>
---
xen/arch/x86/hvm/pmtimer.c | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/xen/arch/x86/hvm/pmtimer.c b/xen/arch/x86/hvm/pmtimer.c
index 5c25cfb..203a939 100644
--- a/xen/arch/x86/hvm/pmtimer.c
+++ b/xen/arch/x86/hvm/pmtimer.c
@@ -85,7 +85,7 @@ void hvm_acpi_sleep_button(struct domain *d)
/* Set the correct value in the timer, accounting for time elapsed
* since the last time we did that. */
-static void pmt_update_time(PMTState *s)
+static void pmt_update_time(PMTState *s, bool_t update_sci)
{
uint64_t curr_gtime, tmp;
uint32_t tmr_val = s->pm.tmr_val, msb = tmr_val & TMR_VAL_MSB;
@@ -107,7 +107,8 @@ static void pmt_update_time(PMTState *s)
if ( (tmr_val & TMR_VAL_MSB) != msb )
{
s->pm.pm1a_sts |= TMR_STS;
- pmt_update_sci(s);
+ if ( update_sci )
+ pmt_update_sci(s);
}
}
@@ -123,7 +124,7 @@ static void pmt_timer_callback(void *opaque)
spin_lock(&s->lock);
/* Recalculate the timer and make sure we get an SCI if we need one */
- pmt_update_time(s);
+ pmt_update_time(s, 1);
/* How close are we to the next MSB flip? */
pmt_cycles_until_flip = TMR_VAL_MSB - (s->pm.tmr_val & (TMR_VAL_MSB - 1));
@@ -221,7 +222,7 @@ static int handle_pmt_io(
if ( spin_trylock(&s->lock) )
{
/* We hold the lock: update timer value and return it. */
- pmt_update_time(s);
+ pmt_update_time(s, 1);
*val = s->pm.tmr_val;
spin_unlock(&s->lock);
}
@@ -244,19 +245,11 @@ static int handle_pmt_io(
static int pmtimer_save(struct domain *d, hvm_domain_context_t *h)
{
PMTState *s = &d->arch.hvm_domain.pl_time.vpmt;
- uint32_t x, msb = s->pm.tmr_val & TMR_VAL_MSB;
int rc;
spin_lock(&s->lock);
- /* Update the counter to the guest's current time. We always save
- * with the domain paused, so the saved time should be after the
- * last_gtime, but just in case, make sure we only go forwards */
- x = ((s->vcpu->arch.hvm_vcpu.guest_time - s->last_gtime) * s->scale) >> 32;
- if ( x < 1UL<<31 )
- s->pm.tmr_val += x;
- if ( (s->pm.tmr_val & TMR_VAL_MSB) != msb )
- s->pm.pm1a_sts |= TMR_STS;
+ pmt_update_time(s, 0);
/* No point in setting the SCI here because we'll already have saved the
* IRQ and *PIC state; we'll fix it up when we restore the domain */
--
1.7.9.5
next prev parent reply other threads:[~2013-03-21 7:32 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-05 6:12 [PATCH] x86/hvm: fix corrupt ACPI PM-Timer during live migration Kouya Shimura
2013-02-12 12:26 ` Jan Beulich
2013-02-14 6:09 ` Kouya Shimura
2013-02-15 16:45 ` Jan Beulich
2013-02-20 7:42 ` Kouya Shimura
2013-03-07 15:58 ` Jan Beulich
2013-03-08 7:59 ` Kouya Shimura
2013-03-21 7:31 ` Kouya Shimura
2013-03-21 8:05 ` Jan Beulich
[not found] ` <514A9BC4.40508@jp.fujitsu.com>
2013-03-21 7:32 ` [PATCH 1/2] x86/hvm: prevent guest's timers from going backwards, when timer_mode=0 Kouya Shimura
2013-03-21 7:32 ` Kouya Shimura [this message]
2013-03-21 10:01 ` [PATCH 2/2] x86/hvm: fix corrupt ACPI PM-Timer during live migration Jan Beulich
2013-03-22 1:12 ` Kouya Shimura
2013-03-22 8:02 ` Jan Beulich
2013-05-15 14:23 ` Alex Bligh
2013-05-15 14:31 ` Jan Beulich
2013-05-15 14:49 ` Alex Bligh
2013-05-15 14:54 ` Jan Beulich
2013-05-16 5:29 ` Kouya Shimura
2013-05-16 10:38 ` Alex Bligh
2013-05-16 5:27 ` Kouya Shimura
2013-05-16 9:54 ` Tim Deegan
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=514AB78A.3010109@jp.fujitsu.com \
--to=kouya@jp.fujitsu.com \
--cc=JBeulich@suse.com \
--cc=xen-devel@lists.xen.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.