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] [xen-unstable] xc_save: remove the dependency on the glo

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] xc_save: remove the dependency on the global si structure
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 18 Mar 2009 07:25:16 -0700
Delivery-date: Wed, 18 Mar 2009 07:25:51 -0700
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/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1237376928 0
# Node ID f00e5d83b9ecb5ba9be48ec53bd7536fe85118bf
# Parent  6d65dc14d21b5b598de925d1b1e0aa8305092273
xc_save: remove the dependency on the global si structure

Signed-off-by: Jiang Yunhong <yunhong.jiang@xxxxxxxxx>
---
 tools/xcutils/xc_save.c |   67 ++++++++++++++++++++++--------------------------
 1 files changed, 31 insertions(+), 36 deletions(-)

diff -r 6d65dc14d21b -r f00e5d83b9ec tools/xcutils/xc_save.c
--- a/tools/xcutils/xc_save.c   Wed Mar 18 11:46:32 2009 +0000
+++ b/tools/xcutils/xc_save.c   Wed Mar 18 11:48:48 2009 +0000
@@ -46,50 +46,41 @@ static int compat_suspend(void)
             !strncmp(ans, "done\n", 5));
 }
 
-static int suspend_evtchn_release(void)
-{
-    if (si.suspend_evtchn >= 0) {
-        xc_evtchn_unbind(si.xce, si.suspend_evtchn);
-        si.suspend_evtchn = -1;
-    }
-    if (si.xce >= 0) {
-        xc_evtchn_close(si.xce);
-        si.xce = -1;
-    }
+static int suspend_evtchn_release(int xce, int suspend_evtchn)
+{
+    if (suspend_evtchn >= 0)
+        xc_evtchn_unbind(xce, suspend_evtchn);
 
     return 0;
 }
 
-static int await_suspend(void)
+static int await_suspend(int xce, int suspend_evtchn)
 {
     int rc;
 
     do {
-        rc = xc_evtchn_pending(si.xce);
+        rc = xc_evtchn_pending(xce);
         if (rc < 0) {
             warnx("error polling suspend notification channel: %d", rc);
             return -1;
         }
-    } while (rc != si.suspend_evtchn);
+    } while (rc != suspend_evtchn);
 
     /* harmless for one-off suspend */
-    if (xc_evtchn_unmask(si.xce, si.suspend_evtchn) < 0)
+    if (xc_evtchn_unmask(xce, suspend_evtchn) < 0)
         warnx("failed to unmask suspend notification channel: %d", rc);
 
     return 0;
 }
 
-static int suspend_evtchn_init(int xc, int domid)
+static int suspend_evtchn_init(int xc, int xce, int domid)
 {
     struct xs_handle *xs;
     char path[128];
     char *portstr;
     unsigned int plen;
     int port;
-    int rc;
-
-    si.xce = -1;
-    si.suspend_evtchn = -1;
+    int rc, suspend_evtchn = -1;
 
     xs = xs_daemon_open();
     if (!xs) {
@@ -108,14 +99,8 @@ static int suspend_evtchn_init(int xc, i
     port = atoi(portstr);
     free(portstr);
 
-    si.xce = xc_evtchn_open();
-    if (si.xce < 0) {
-        warnx("failed to open event channel handle");
-        goto cleanup;
-    }
-
-    si.suspend_evtchn = xc_evtchn_bind_interdomain(si.xce, domid, port);
-    if (si.suspend_evtchn < 0) {
+    suspend_evtchn = xc_evtchn_bind_interdomain(xce, domid, port);
+    if (suspend_evtchn < 0) {
         warnx("failed to bind suspend event channel: %d", si.suspend_evtchn);
         goto cleanup;
     }
@@ -127,12 +112,13 @@ static int suspend_evtchn_init(int xc, i
     }
 
     /* event channel is pending immediately after binding */
-    await_suspend();
-
-    return 0;
-
-  cleanup:
-    suspend_evtchn_release();
+    await_suspend(xce, suspend_evtchn);
+
+    return suspend_evtchn;
+
+cleanup:
+    if (suspend_evtchn > 0)
+        suspend_evtchn_release(xce, suspend_evtchn);
 
     return -1;
 }
@@ -150,7 +136,7 @@ static int evtchn_suspend(void)
         return 0;
     }
 
-    if (await_suspend() < 0) {
+    if (await_suspend(si.xce, si.suspend_evtchn) < 0) {
         warnx("suspend failed");
         return 0;
     }
@@ -323,14 +309,23 @@ main(int argc, char **argv)
     max_f = atoi(argv[4]);
     si.flags = atoi(argv[5]);
 
-    if (suspend_evtchn_init(si.xc_fd, si.domid) < 0)
+
+    si.xce = xc_evtchn_open();
+    if (si.xce < 0)
+        errx(1, "failed to open event channel handle");
+
+    si.suspend_evtchn = suspend_evtchn_init(si.xc_fd, si.xce, si.domid);
+
+    if (si.suspend_evtchn < 0)
         warnx("suspend event channel initialization failed, using slow path");
 
     ret = xc_domain_save(si.xc_fd, io_fd, si.domid, maxit, max_f, si.flags, 
                          &suspend, !!(si.flags & XCFLAGS_HVM),
                          &init_qemu_maps, &qemu_flip_buffer);
 
-    suspend_evtchn_release();
+    suspend_evtchn_release(si.xce, si.suspend_evtchn);
+
+    xc_evtchn_close(si.xce);
 
     xc_interface_close(si.xc_fd);
 

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] xc_save: remove the dependency on the global si structure, Xen patchbot-unstable <=