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

[Xen-devel] when timer go back in dom0 save and restore or migrate, PV domain hung


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: "James Song" <jsong@xxxxxxxxxx>
  • Date: Tue, 25 Nov 2008 01:01:42 -0700
  • Delivery-date: Tue, 25 Nov 2008 00:02:24 -0800
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

Hi,
   I find PV domin hung, When we take those steps
         1, save PV domain
         2, change system time of PV domain back
         3, restore a PV domain
        or
         1, migrate a PV domain from Machine A to Machine B
         2, the system time of Machine B is slower than Machine A.
   the problem is wc_sec will be change when system-time chanaged in dom0 or restore in a slower-system-time machine, but when restoring, xen don't restore the wc_sec of share_info from xenstore and use native one. So guest os will hang.
this patch will work for this issue.

 Thanks
 -- Song Wei

diff -r a5ed0dbc829f tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c    Tue Nov 18 14:34:14 2008 +0800
+++ b/tools/libxc/xc_domain_restore.c    Fri Nov 21 17:34:15 2008 +0800
@@ -328,6 +328,16 @@
 
     /* For info only */
     nr_pfns = 0;
+    //jsong@xxxxxxxxxx, james song
+    memset(&domctl, 0, sizeof(domctl));
+    domctl.domain = dom;
+    domctl.cmd    = XEN_DOMCTL_restoredomain;
+    frc = do_domctl(xc_handle, &domctl);
+    if ( frc != 0 )
+    {
+            ERROR("Unable to set flag of restore.");
+            goto out;
+    }
 
     if ( read_exact(io_fd, &p2m_size, sizeof(unsigned long)) )
     {
@@ -1120,6 +1130,8 @@
 
     /* restore saved vcpu_info and arch specific info */
     MEMCPY_FIELD(new_shared_info, old_shared_info, vcpu_info);
+    MEMCPY_FIELD(new_shared_info, old_shared_info, wc_nsec);
+    MEMCPY_FIELD(new_shared_info, old_shared_info, wc_sec);
     MEMCPY_FIELD(new_shared_info, old_shared_info, arch);
 
     /* clear any pending events and the selector */
diff -r a5ed0dbc829f xen/arch/x86/time.c
--- a/xen/arch/x86/time.c    Tue Nov 18 14:34:14 2008 +0800
+++ b/xen/arch/x86/time.c    Fri Nov 21 17:34:15 2008 +0800
@@ -689,7 +689,6 @@
     wmb();
     (*version)++;
 }
-
 void update_vcpu_system_time(struct vcpu *v)
 {
     struct cpu_time       *t;
@@ -703,7 +702,6 @@
 
     if ( u->tsc_timestamp == t->local_tsc_stamp )
         return;
-
     version_update_begin(&u->version);
 
     u->tsc_timestamp     = t->local_tsc_stamp;
@@ -713,14 +711,19 @@
 
     version_update_end(&u->version);
 }
-
 void update_domain_wallclock_time(struct domain *d)
 {
     spin_lock(&wc_lock);
+    if(d->after_restore )
+    {
+        d->after_restore = 0;
+        goto out; //jsong@xxxxxxxxxx
+    }
     version_update_begin(&shared_info(d, wc_version));
     shared_info(d, wc_sec)  = wc_sec + d->time_offset_seconds;
     shared_info(d, wc_nsec) = wc_nsec;
     version_update_end(&shared_info(d, wc_version));
+out:
     spin_unlock(&wc_lock);
 }
 
@@ -751,7 +754,6 @@
     u64 x;
     u32 y, _wc_sec, _wc_nsec;
     struct domain *d;
-
     x = (secs * 1000000000ULL) + (u64)nsecs - system_time_base;
     y = do_div(x, 1000000000);
 
@@ -1050,7 +1052,6 @@
 struct tm wallclock_time(void)
 {
     uint64_t seconds;
-
     if ( !wc_sec )
         return (struct tm) { 0 };
 
diff -r a5ed0dbc829f xen/common/domctl.c
--- a/xen/common/domctl.c    Tue Nov 18 14:34:14 2008 +0800
+++ b/xen/common/domctl.c    Fri Nov 21 17:34:15 2008 +0800
@@ -24,7 +24,6 @@
 #include <asm/current.h>
 #include <public/domctl.h>
 #include <xsm/xsm.h>
-
 extern long arch_do_domctl(
     struct xen_domctl *op, XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
 
@@ -315,6 +314,16 @@
         ret = 0;
     }
     break;
+   case XEN_DOMCTL_restoredomain:
+   {
+        struct domain *d;
+        if ( (d = rcu_lock_domain_by_id(op->domain)) == NULL )
+            break;
+       
+        d->after_restore = 1;
+        rcu_unlock_domain(d);
+        break;
+   }
 
     case XEN_DOMCTL_createdomain:
     {
diff -r a5ed0dbc829f xen/include/public/domctl.h
--- a/xen/include/public/domctl.h    Tue Nov 18 14:34:14 2008 +0800
+++ b/xen/include/public/domctl.h    Fri Nov 21 17:34:15 2008 +0800
@@ -61,6 +61,7 @@
 #define XEN_DOMCTL_destroydomain      2
 #define XEN_DOMCTL_pausedomain        3
 #define XEN_DOMCTL_unpausedomain      4
+#define XEN_DOMCTL_restoredomain      51
 #define XEN_DOMCTL_resumedomain      27
 
 #define XEN_DOMCTL_getdomaininfo      5
diff -r a5ed0dbc829f xen/include/xen/sched.h
--- a/xen/include/xen/sched.h    Tue Nov 18 14:34:14 2008 +0800
+++ b/xen/include/xen/sched.h    Fri Nov 21 17:34:15 2008 +0800
@@ -231,6 +231,7 @@
      * cause a deadlock. Acquirers don't spin waiting; they preempt.
      */
     spinlock_t hypercall_deadlock_mutex;
+    int after_restore; //jsong@xxxxxxxxxx
 };
 
 struct domain_setup_info
---------------------------------------------------------------------------------------------
 Thanks
--Song wei

_______________________________________________
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®.