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-changelog

[Xen-changelog] Implement the parts of vm save which need interaction wi

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Implement the parts of vm save which need interaction with xend
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Tue, 24 May 2005 17:47:14 +0000
Delivery-date: Tue, 24 May 2005 18:01:39 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1527.2.1, 2005/05/24 18:47:14+01:00, cl349@xxxxxxxxxxxxxxxxxxxx

        Implement the parts of vm save which need interaction with xend
        as part of xend, instead of using xfrd.
        Execute xc_linux_save in a seperate process so that it can't
        crash xend.  Also handle errors passed from xc_linux_save.
        xen_domain.c:
          Disable save in xfrd.
        xc_save.c:
          new file
        Makefile:
          Add xc_save.
        XendDomainInfo.py:
          Add suspended state and threading Condition with notification, 
allowing
          easy waiting for state changes.
        XendDomain.py:
          Implement the parts of vm save which need interaction with xend
          as part of xend, instead of using xfrd.  Set state to "suspended"
          when detecting a suspended domain.
          Fix reading output from subprocesses.
          Fix ValueError in xen_domain().
        xc.c:
          Remove python binding for xc_linux_save.
        xc_linux_save.c:
          Implement the parts of vm save which need interaction with xend
          as part of xend, instead of using xfrd.  Also run xc_linux_save
          in a seperate process.
        xc_linux_restore.c:
          Flush output so that xend picks it up timely.
          Also disable debug output again.
        xc.h:
          Update xc_linux_save prototype and fix comments for 
xc_linux_{save,restore}.
        ignore:
          Add tools/xcutils/xc_save.
        xpopen.py:
          Exit with 127 if exec fails.
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 libxc/xc.h                        |   17 -
 libxc/xc_linux_restore.c          |    8 
 libxc/xc_linux_save.c             |  339 ++++++++++++++++++--------------------
 python/xen/lowlevel/xc/xc.c       |   96 ----------
 python/xen/util/xpopen.py         |    2 
 python/xen/xend/XendDomain.py     |   90 ++++++++--
 python/xen/xend/XendDomainInfo.py |   16 +
 xcutils/Makefile                  |    3 
 xcutils/xc_save.c                 |   29 +++
 xfrd/xen_domain.c                 |    2 
 10 files changed, 302 insertions(+), 300 deletions(-)


diff -Nru a/tools/libxc/xc.h b/tools/libxc/xc.h
--- a/tools/libxc/xc.h  2005-05-24 14:02:18 -04:00
+++ b/tools/libxc/xc.h  2005-05-24 14:02:18 -04:00
@@ -225,23 +225,22 @@
 struct XcIOContext;
 
 /**
- * This function will save a domain running Linux to an IO context.  This
- * IO context is currently a private interface making this function difficult
- * to call.  It's interface will likely change in the future.
+ * This function will save a domain running Linux.
  *
  * @parm xc_handle a handle to an open hypervisor interface
- * @parm ioctxt the IO context to save a domain to
+ * @parm fd the file descriptor to save a domain to
+ * @parm dom the id of the domain
  * @return 0 on success, -1 on failure
  */
-int xc_linux_save(int xc_handle, struct XcIOContext *ioctxt);
+int xc_linux_save(int xc_handle, int fd, u32 dom);
 
 /**
- * This function will restore a saved domain running Linux to an IO context.
- * Like xc_linux_save(), this function uses a parameter who's structure is
- * privately defined.  It's interface will also likely change.
+ * This function will restore a saved domain running Linux.
  *
  * @parm xc_handle a handle to an open hypervisor interface
- * @parm ioctxt the IO context to restore a domain from
+ * @parm fd the file descriptor to restore a domain from
+ * @parm dom the id of the domain
+ * @parm nr_pfns the number of pages
  * @return 0 on success, -1 on failure
  */
 int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns);
diff -Nru a/tools/libxc/xc_linux_restore.c b/tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c    2005-05-24 14:02:19 -04:00
+++ b/tools/libxc/xc_linux_restore.c    2005-05-24 14:02:19 -04:00
@@ -11,23 +11,23 @@
 
 #define MAX_BATCH_SIZE 1024
 
-#define DEBUG 01
+#define DEBUG 0
 
 #if 1
-#define ERR(_f, _a...) fprintf ( stderr, _f , ## _a )
+#define ERR(_f, _a...) fprintf ( stderr, _f , ## _a ); fflush(stderr)
 #else
 #define ERR(_f, _a...) ((void)0)
 #endif
 
 #if DEBUG
-#define DPRINTF(_f, _a...) fprintf ( stdout, _f , ## _a )
+#define DPRINTF(_f, _a...) fprintf ( stdout, _f , ## _a ); fflush(stdout)
 #else
 #define DPRINTF(_f, _a...) ((void)0)
 #endif
 
 #define PROGRESS 0
 #if PROGRESS
-#define PPRINTF(_f, _a...) fprintf ( stderr, _f , ## _a )
+#define PPRINTF(_f, _a...) fprintf ( stderr, _f , ## _a ); fflush(stderr)
 #else
 #define PPRINTF(_f, _a...)
 #endif
diff -Nru a/tools/libxc/xc_linux_save.c b/tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c       2005-05-24 14:02:19 -04:00
+++ b/tools/libxc/xc_linux_save.c       2005-05-24 14:02:19 -04:00
@@ -17,19 +17,25 @@
 
 #define MAX_MBIT_RATE 500
 
-#define DEBUG  0
-#define DDEBUG 0
+#define DEBUG 0
+
+#if 1
+#define ERR(_f, _a...) fprintf ( stderr, _f , ## _a )
+#else
+#define ERR(_f, _a...) ((void)0)
+#endif
 
 #if DEBUG
-#define DPRINTF(_f, _a...) printf ( _f , ## _a )
+#define DPRINTF(_f, _a...) fprintf ( stderr, _f , ## _a )
 #else
 #define DPRINTF(_f, _a...) ((void)0)
 #endif
 
-#if DDEBUG
-#define DDPRINTF(_f, _a...) printf ( _f , ## _a )
+#define PROGRESS 0
+#if PROGRESS
+#define PPRINTF(_f, _a...) fprintf ( stderr, _f , ## _a )
 #else
-#define DDPRINTF(_f, _a...) ((void)0)
+#define PPRINTF(_f, _a...)
 #endif
 
 /*
@@ -144,7 +150,7 @@
 }
 
 
-#define START_MBIT_RATE ioctxt->resource
+#define START_MBIT_RATE 0 //ioctxt->resource
 
 static int mbit_rate, ombit_rate = 0;
 static int burst_time_us = -1;
@@ -167,7 +173,8 @@
 #define RATE_TO_BTU 781250
 #define BURST_TIME_US burst_time_us
 
-static int xcio_ratewrite(XcIOContext *ioctxt, void *buf, int n)
+static int
+ratewrite(int io_fd, void *buf, int n)
 {
     static int budget = 0;
     static struct timeval last_put = { 0 };
@@ -176,16 +183,15 @@
     long long delta;
 
     if (START_MBIT_RATE == 0)
-       return xcio_write(ioctxt, buf, n);
+       return write(io_fd, buf, n);
     
     budget -= n;
     if (budget < 0) {
        if (MBIT_RATE != ombit_rate) {
            BURST_TIME_US = RATE_TO_BTU / MBIT_RATE;
            ombit_rate = MBIT_RATE;
-           xcio_info(ioctxt,
-                     "rate limit: %d mbit/s burst budget %d slot time %d\n",
-                     MBIT_RATE, BURST_BUDGET, BURST_TIME_US);
+           DPRINTF("rate limit: %d mbit/s burst budget %d slot time %d\n",
+                   MBIT_RATE, BURST_BUDGET, BURST_TIME_US);
        }
        if (last_put.tv_sec == 0) {
            budget += BURST_BUDGET;
@@ -213,7 +219,7 @@
            }
        }
     }
-    return xcio_write(ioctxt, buf, n);
+    return write(io_fd, buf, n);
 }
 
 static int print_stats( int xc_handle, u32 domid, 
@@ -235,7 +241,7 @@
     d1_cpu_now = xc_domain_get_cpu_usage(xc_handle, domid, /* FIXME */ 0)/1000;
 
     if ( (d0_cpu_now == -1) || (d1_cpu_now == -1) ) 
-        printf("ARRHHH!!\n");
+        fprintf(stderr, "ARRHHH!!\n");
 
     wall_delta = tv_delta(&wall_now,&wall_last)/1000;
 
@@ -245,14 +251,15 @@
     d1_cpu_delta  = (d1_cpu_now - d1_cpu_last)/1000;
 
     if ( print )
-        printf("delta %lldms, dom0 %d%%, target %d%%, sent %dMb/s, "
-               "dirtied %dMb/s %" PRId32 " pages\n",
-               wall_delta, 
-               (int)((d0_cpu_delta*100)/wall_delta),
-               (int)((d1_cpu_delta*100)/wall_delta),
-               (int)((pages_sent*PAGE_SIZE)/(wall_delta*(1000/8))),
-               (int)((stats->dirty_count*PAGE_SIZE)/(wall_delta*(1000/8))),
-               stats->dirty_count);
+        fprintf(stderr,
+               "delta %lldms, dom0 %d%%, target %d%%, sent %dMb/s, "
+               "dirtied %dMb/s %" PRId32 " pages\n",
+               wall_delta, 
+               (int)((d0_cpu_delta*100)/wall_delta),
+               (int)((d1_cpu_delta*100)/wall_delta),
+               (int)((pages_sent*PAGE_SIZE)/(wall_delta*(1000/8))),
+               (int)((stats->dirty_count*PAGE_SIZE)/(wall_delta*(1000/8))),
+               stats->dirty_count);
 
     if (((stats->dirty_count*PAGE_SIZE)/(wall_delta*(1000/8))) > mbit_rate) {
        mbit_rate = (int)((stats->dirty_count*PAGE_SIZE)/(wall_delta*(1000/8)))
@@ -268,24 +275,6 @@
     return 0;
 }
 
-/** Write the vmconfig string.
- * It is stored as a 4-byte count 'n' followed by n bytes.
- *
- * @param ioctxt i/o context
- * @return 0 on success, non-zero on error.
- */
-static int write_vmconfig(XcIOContext *ioctxt)
-{
-    int err = -1;
-    if(xcio_write(ioctxt, &ioctxt->vmconfig_n, sizeof(ioctxt->vmconfig_n))) 
-        goto exit;
-    if(xcio_write(ioctxt, ioctxt->vmconfig, ioctxt->vmconfig_n)) 
-        goto exit;
-    err = 0;
-  exit:
-    return err;
-}
-
 static int analysis_phase( int xc_handle, u32 domid, 
                            int nr_pfns, unsigned long *arr, int runs )
 {
@@ -302,7 +291,7 @@
         xc_shadow_control( xc_handle, domid, 
                            DOM0_SHADOW_CONTROL_OP_CLEAN,
                            arr, nr_pfns, NULL);
-        printf("#Flush\n");
+        fprintf(stderr, "#Flush\n");
         for ( i = 0; i < 40; i++ )
         {     
             usleep(50000);     
@@ -311,11 +300,11 @@
                                DOM0_SHADOW_CONTROL_OP_PEEK,
                                NULL, 0, &stats);
 
-            printf("now= %lld faults= %" PRId32 " dirty= %" PRId32
-                   " dirty_net= %" PRId32 " dirty_block= %" PRId32"\n", 
-                   ((now-start)+500)/1000, 
-                   stats.fault_count, stats.dirty_count,
-                   stats.dirty_net_count, stats.dirty_block_count);
+            fprintf(stderr, "now= %lld faults= %" PRId32 " dirty= %" PRId32
+                   " dirty_net= %" PRId32 " dirty_block= %" PRId32"\n", 
+                   ((now-start)+500)/1000, 
+                   stats.fault_count, stats.dirty_count,
+                   stats.dirty_net_count, stats.dirty_block_count);
         }
     }
 
@@ -323,26 +312,36 @@
 }
 
 
-int suspend_and_state(int xc_handle, XcIOContext *ioctxt,                    
+int suspend_and_state(int xc_handle, int io_fd,        int dom,              
                       xc_dominfo_t *info,
                       vcpu_guest_context_t *ctxt)
 {
     int i=0;
-    
-    xcio_suspend_domain(ioctxt);
+    char ans[30];
+
+    printf("suspend\n");
+    fflush(stdout);
+    if (fgets(ans, sizeof(ans), stdin) == NULL) {

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Implement the parts of vm save which need interaction with xend, BitKeeper Bot <=