All of lore.kernel.org
 help / color / mirror / Atom feed
* when timer go back in dom0 save and restore or migrate, PV domain hung
@ 2008-11-25  8:01 James Song
  2008-11-26 14:00 ` Tian, Kevin
  0 siblings, 1 reply; 8+ messages in thread
From: James Song @ 2008-11-25  8:01 UTC (permalink / raw)
  To: xen-devel


[-- Attachment #1.1: Type: text/plain, Size: 4760 bytes --]

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@novell.com, 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@novell.com
+    }
     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@novell.com
 };
 
 struct domain_setup_info
---------------------------------------------------------------------------------------------
 Thanks
--Song wei



[-- Attachment #1.2: Type: text/html, Size: 7698 bytes --]

[-- Attachment #2: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2008-11-27  1:17 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-25  8:01 when timer go back in dom0 save and restore or migrate, PV domain hung James Song
2008-11-26 14:00 ` Tian, Kevin
2008-11-26 14:11   ` Keir Fraser
2008-11-26 14:20     ` Tian, Kevin
2008-11-26 14:26       ` Keir Fraser
2008-11-26 14:32         ` Tian, Kevin
2008-11-26 14:58           ` Keir Fraser
2008-11-27  1:17             ` Tian, Kevin

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.