WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 1/2] Migrate tsc values during migration

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Dave Winchell <dwinchell@xxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 1/2] Migrate tsc values during migration
From: Ben Guthro <bguthro@xxxxxxxxxxxxxxx>
Date: Thu, 05 Jun 2008 10:59:59 -0400
Delivery-date: Thu, 05 Jun 2008 08:00:51 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.14 (X11/20080501)
Migrate the last TSC values for more accurate timekeeping during live migration

Signed-off-by: Dave Winchell <dwinchell@xxxxxxxxxxxxxxx>
Signed-off-by: Ben Guthro <bguthro@xxxxxxxxxxxxxxx>
diff -r f1508348ffab tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c   Mon Jun 02 11:35:39 2008 +0900
+++ b/tools/libxc/xc_domain_restore.c   Mon Jun 02 17:04:46 2008 -0400
@@ -32,6 +32,12 @@
 #include <xen/hvm/ioreq.h>
 #include <xen/hvm/params.h>
 
+#define rdtscll(val) do { \
+     unsigned int a,d; \
+     asm volatile("rdtsc" : "=a" (a), "=d" (d)); \
+     (val) = ((unsigned long)a) | (((unsigned long)d)<<32); \
+} while(0)
+
 /* max mfn of the current host machine */
 static unsigned long max_mfn;
 
@@ -327,6 +333,8 @@ int xc_domain_restore(int xc_handle, int
     /* Buffer for holding HVM context */
     uint8_t *hvm_buf = NULL;
 
+    uint64_t last_tsc, cur_tsc;
+
     /* For info only */
     nr_pfns = 0;
 
@@ -738,6 +746,16 @@ int xc_domain_restore(int xc_handle, int
             ERROR("error loading the HVM context");
             goto out;
         }
+
+        if ( read_exact(io_fd, &last_tsc, sizeof(last_tsc)) )
+        {
+            ERROR("error loading the last_tsc");
+            goto out;
+        }
+
+       rdtscll(cur_tsc);
+        xc_set_hvm_param(xc_handle, dom, HVM_PARAM_MIG_LAST_TSC, last_tsc);
+        xc_set_hvm_param(xc_handle, dom, HVM_PARAM_MIG_CUR_TSC, cur_tsc);
         
         frc = xc_domain_hvm_setcontext(xc_handle, dom, hvm_buf, rec_len);
         if ( frc )
diff -r f1508348ffab tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c      Mon Jun 02 11:35:39 2008 +0900
+++ b/tools/libxc/xc_domain_save.c      Mon Jun 02 17:04:14 2008 -0400
@@ -29,6 +29,12 @@
 */
 #define DEF_MAX_ITERS   29   /* limit us to 30 times round loop   */
 #define DEF_MAX_FACTOR   3   /* never send more than 3x p2m_size  */
+
+#define rdtscll(val) do { \
+     unsigned int a,d; \
+     asm volatile("rdtsc" : "=a" (a), "=d" (d)); \
+     (val) = ((unsigned long)a) | (((unsigned long)d)<<32); \
+} while(0)
 
 /* max mfn of the whole machine */
 static unsigned long max_mfn;
@@ -845,6 +851,8 @@ int xc_domain_save(int xc_handle, int io
     /* HVM: a buffer for holding HVM context */
     uint32_t hvm_buf_size = 0;
     uint8_t *hvm_buf = NULL;
+
+    uint64_t last_tsc;
 
     /* HVM: magic frames for ioreqs and xenstore comms. */
     uint64_t magic_pfns[3]; /* ioreq_pfn, bufioreq_pfn, store_pfn */
@@ -1474,6 +1482,14 @@ int xc_domain_save(int xc_handle, int io
             PERROR("write HVM info failed!\n");
             goto out;
         }
+
+        rdtscll(last_tsc);
+        if ( write_exact(io_fd, &last_tsc, sizeof(last_tsc)) )
+        {
+            PERROR("error write last_tsc");
+            goto out;
+        }
+
         
         /* HVM guests are done now */
         rc = 0;
diff -r f1508348ffab xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Mon Jun 02 11:35:39 2008 +0900
+++ b/xen/arch/x86/hvm/hvm.c    Mon Jun 02 17:08:16 2008 -0400
@@ -2385,6 +2385,12 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 if ( a.value > HVMPTM_one_missed_tick_pending )
                     rc = -EINVAL;
                 break;
+            case HVM_PARAM_MIG_LAST_TSC:
+                d->last_tsc_sender = a.value;
+                break;
+            case HVM_PARAM_MIG_CUR_TSC:
+                d->first_tsc_receiver = a.value;
+                break;
             case HVM_PARAM_IDENT_PT:
                 rc = -EPERM;
                 if ( !IS_PRIV(current->domain) )
diff -r f1508348ffab xen/include/public/hvm/params.h
--- a/xen/include/public/hvm/params.h   Mon Jun 02 11:35:39 2008 +0900
+++ b/xen/include/public/hvm/params.h   Mon Jun 02 17:18:14 2008 -0400
@@ -93,6 +93,10 @@
 /* ACPI S state: currently support S0 and S3 on x86. */
 #define HVM_PARAM_ACPI_S_STATE 14
 
-#define HVM_NR_PARAMS          15
+/* Migrate uses these to allow hpet load time compensation. */
+#define HVM_PARAM_MIG_LAST_TSC 15
+#define HVM_PARAM_MIG_CUR_TSC  16
+
+#define HVM_NR_PARAMS          17
 
 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
diff -r f1508348ffab xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Mon Jun 02 11:35:39 2008 +0900
+++ b/xen/include/xen/sched.h   Mon Jun 02 17:09:46 2008 -0400
@@ -233,6 +233,9 @@ struct domain
 
     struct rcu_head rcu;
 
+    unsigned long last_tsc_sender;
+    unsigned long first_tsc_receiver;
+
     /*
      * Hypercall deadlock avoidance lock. Used if a hypercall might
      * cause a deadlock. Acquirers don't spin waiting; they preempt.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>