[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] [Bugfix][pv-ops] Guest get stucked after migration


  • To: xen-devel@xxxxxxxxxxxxxxxxxxx, Jeremy Fitzhardinge <Jeremy.Fitzhardinge@xxxxxxxxxx>, Ian Campbell <Ian.Campbell@xxxxxxxxxx>
  • From: Frank Pan <frankpzh@xxxxxxxxx>
  • Date: Tue, 22 Mar 2011 02:26:19 +0800
  • Cc:
  • Delivery-date: Mon, 21 Mar 2011 11:33:27 -0700
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=xs7nyBvD7dmCtDhirABAySlGw/FVfdHUYUyXbAFIZ3adEBRKmRb9Ik8e+O4YoeduQX yXSlSRs2we2jadb4iVZZuZVEipifw6NrV9NXRuVda6y9L/FDcTcwkmu8zwI7inh6gKwB 8v4GNPgDVLPEdrgpjVygbx58P1+zE6qge6niQ=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

In recent pv-ops kernel, pvclock is not guaranteed as monotone.
After a migration, pvclock can produce smaller cycle count.

[The test is performed on next-2.6.32 tree]
The issue occured when uptime(sender) > uptime(target), and with
CONFIG_GENERIC_TIME. The guest get stucked after the migration,
doing a huge loop inside update_wall_time, until the overflow of
64-bit unsigned offset.

The following patch fixed this issue by introducing a global sign.
Xen pvclock will update the cycle_last with the newest cycle count
on the first read after migration.

Signed-off-by: Frank Pan <frankpzh@xxxxxxxxx>
---
 linux-2.6-xen/arch/x86/xen/time.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/linux-2.6-xen/arch/x86/xen/time.c
b/linux-2.6-xen/arch/x86/xen/time.c
index ab35140..ac6fe2a 100644
--- a/linux-2.6-xen/arch/x86/xen/time.c
+++ b/linux-2.6-xen/arch/x86/xen/time.c
@@ -41,6 +41,9 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info,
runstate_snapshot);
 static DEFINE_PER_CPU(u64, residual_stolen);
 static DEFINE_PER_CPU(u64, residual_blocked);

+/* xen_clocksource_get_cycles should update cycle_last after resume */
+static int just_resume = 0;
+
 /* return an consistent snapshot of 64-bit time/counter value */
 static u64 get64(const u64 *p)
 {
@@ -177,7 +180,13 @@ cycle_t xen_clocksource_read(void)

 static cycle_t xen_clocksource_get_cycles(struct clocksource *cs)
 {
-       return xen_clocksource_read();
+       cycle_t c = xen_clocksource_read();
+
+       if (unlikely(just_resume)) {
+               cs->cycle_last = c++;
+               just_resume = 0;
+       }
+       return c;
 }

 static void xen_read_wallclock(struct timespec *ts)
@@ -441,6 +450,7 @@ void xen_timer_resume(void)
 {
        int cpu;

+       just_resume = 1;
        pvclock_resume();

        if (xen_clockevent != &xen_vcpuop_clockevent)
-- 
1.7.0.4


-- 
æéç, Frank Pan

Computer Science and Technology
Tsinghua University

Attachment: 0001-Bugfix-pv-ops-Guest-get-stucked-after-migration.patch
Description: Text Data

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.