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

[Xen-devel] RE: [PATCH] libxc: fix link error of xc_save on ia64



Isaku, really sorry to break IA64 again. A bit strange that I tried it in our 
internal test, maybe I missed some step for that tools.

Thanks
Yunhong Jiang

>-----Original Message-----
>From: Isaku Yamahata [mailto:yamahata@xxxxxxxxxxxxx] 
>Sent: 2009年3月24日 12:16
>To: xen-devel@xxxxxxxxxxxxxxxxxxx
>Cc: Jiang, Yunhong
>Subject: [PATCH] libxc: fix link error of xc_save on ia64
>
>note: the copyright clause is copied from
>tools/xcutils/xc_save.c
>
>libxc: fix link error of xc_save on ia64
>
>The suspend event channel functions are arch independent code
>which xc_save uses.
>The changeset of 19382:a5f497f02e34 cause link error on ia64.
>This patch moves the functions into arch common file from
>x86 specific file xc_domain_save.c
>
>Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
>
>diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile
>--- a/tools/libxc/Makefile
>+++ b/tools/libxc/Makefile
>@@ -29,7 +29,7 @@ CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.
> CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c
> 
> GUEST_SRCS-y :=
>-GUEST_SRCS-y += xg_private.c
>+GUEST_SRCS-y += xg_private.c xc_suspend.c
> GUEST_SRCS-$(CONFIG_MIGRATE) += xc_domain_restore.c xc_domain_save.c
> GUEST_SRCS-$(CONFIG_HVM) += xc_hvm_build.c
> 
>diff --git a/tools/libxc/xc_domain_save.c 
>b/tools/libxc/xc_domain_save.c
>--- a/tools/libxc/xc_domain_save.c
>+++ b/tools/libxc/xc_domain_save.c
>@@ -744,115 +744,6 @@ static xen_pfn_t *map_and_save_p2m_table
>     return success ? p2m : NULL;
> }
> 
>-#define SUSPEND_LOCK_FILE "/var/lib/xen/suspend_evtchn_lock.d"
>-static int lock_suspend_event(void)
>-{
>-    int fd, rc;
>-    mode_t mask;
>-    char buf[128];
>-
>-    mask = umask(022);
>-    fd = open(SUSPEND_LOCK_FILE, O_CREAT | O_EXCL | O_RDWR, 0666);
>-    if (fd < 0)
>-    {
>-        ERROR("Can't create lock file for suspend event channel\n");
>-        return -EINVAL;
>-    }
>-    umask(mask);
>-    snprintf(buf, sizeof(buf), "%10ld", (long)getpid());
>-
>-    rc = write_exact(fd, buf, strlen(buf));
>-    close(fd);
>-
>-    return rc;
>-}
>-
>-static int unlock_suspend_event(void)
>-{
>-    int fd, pid, n;
>-    char buf[128];
>-
>-    fd = open(SUSPEND_LOCK_FILE, O_RDWR);
>-
>-    if (fd < 0)
>-        return -EINVAL;
>-
>-    n = read(fd, buf, 127);
>-
>-    close(fd);
>-
>-    if (n > 0)
>-    {
>-        sscanf(buf, "%d", &pid);
>-        /* We are the owner, so we can simply delete the file */
>-        if (pid == getpid())
>-        {
>-            unlink(SUSPEND_LOCK_FILE);
>-            return 0;
>-        }
>-    }
>-
>-    return -EPERM;
>-}
>-
>-int xc_await_suspend(int xce, int suspend_evtchn)
>-{
>-    int rc;
>-
>-    do {
>-        rc = xc_evtchn_pending(xce);
>-        if (rc < 0) {
>-            ERROR("error polling suspend notification 
>channel: %d", rc);
>-            return -1;
>-        }
>-    } while (rc != suspend_evtchn);
>-
>-    /* harmless for one-off suspend */
>-    if (xc_evtchn_unmask(xce, suspend_evtchn) < 0)
>-        ERROR("failed to unmask suspend notification channel: 
>%d", rc);
>-
>-    return 0;
>-}
>-
>-int xc_suspend_evtchn_release(int xce, int suspend_evtchn)
>-{
>-    if (suspend_evtchn >= 0)
>-        xc_evtchn_unbind(xce, suspend_evtchn);
>-
>-    return unlock_suspend_event();
>-}
>-
>-int xc_suspend_evtchn_init(int xc, int xce, int domid, int port)
>-{
>-    int rc, suspend_evtchn = -1;
>-
>-    if (lock_suspend_event())
>-        return -EINVAL;
>-
>-    suspend_evtchn = xc_evtchn_bind_interdomain(xce, domid, port);
>-    if (suspend_evtchn < 0) {
>-        ERROR("failed to bind suspend event channel: %d", 
>suspend_evtchn);
>-        goto cleanup;
>-    }
>-
>-    rc = xc_domain_subscribe_for_suspend(xc, domid, port);
>-    if (rc < 0) {
>-        ERROR("failed to subscribe to domain: %d", rc);
>-        goto cleanup;
>-    }
>-
>-    /* event channel is pending immediately after binding */
>-    xc_await_suspend(xce, suspend_evtchn);
>-
>-    return suspend_evtchn;
>-
>-cleanup:
>-    if (suspend_evtchn > 0)
>-        xc_suspend_evtchn_release(xce, suspend_evtchn);
>-
>-    return -1;
>-}
>-
> int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, 
>uint32_t max_iters,
>                    uint32_t max_factor, uint32_t flags, int 
>(*suspend)(void),
>                    int hvm, void *(*init_qemu_maps)(int, unsigned), 
>diff --git a/tools/libxc/xc_suspend.c b/tools/libxc/xc_suspend.c
>new file mode 100644
>--- /dev/null
>+++ b/tools/libxc/xc_suspend.c
>@@ -0,0 +1,117 @@
>+/*
>+ * This file is subject to the terms and conditions of the GNU General
>+ * Public License.  See the file "COPYING" in the main directory of
>+ * this archive for more details.
>+ */
>+
>+#include "xc_private.h"
>+#include "xenguest.h"
>+
>+#define SUSPEND_LOCK_FILE "/var/lib/xen/suspend_evtchn_lock.d"
>+static int lock_suspend_event(void)
>+{
>+    int fd, rc;
>+    mode_t mask;
>+    char buf[128];
>+
>+    mask = umask(022);
>+    fd = open(SUSPEND_LOCK_FILE, O_CREAT | O_EXCL | O_RDWR, 0666);
>+    if (fd < 0)
>+    {
>+        ERROR("Can't create lock file for suspend event channel\n");
>+        return -EINVAL;
>+    }
>+    umask(mask);
>+    snprintf(buf, sizeof(buf), "%10ld", (long)getpid());
>+
>+    rc = write_exact(fd, buf, strlen(buf));
>+    close(fd);
>+
>+    return rc;
>+}
>+
>+static int unlock_suspend_event(void)
>+{
>+    int fd, pid, n;
>+    char buf[128];
>+
>+    fd = open(SUSPEND_LOCK_FILE, O_RDWR);
>+
>+    if (fd < 0)
>+        return -EINVAL;
>+
>+    n = read(fd, buf, 127);
>+
>+    close(fd);
>+
>+    if (n > 0)
>+    {
>+        sscanf(buf, "%d", &pid);
>+        /* We are the owner, so we can simply delete the file */
>+        if (pid == getpid())
>+        {
>+            unlink(SUSPEND_LOCK_FILE);
>+            return 0;
>+        }
>+    }
>+
>+    return -EPERM;
>+}
>+
>+int xc_await_suspend(int xce, int suspend_evtchn)
>+{
>+    int rc;
>+
>+    do {
>+        rc = xc_evtchn_pending(xce);
>+        if (rc < 0) {
>+            ERROR("error polling suspend notification 
>channel: %d", rc);
>+            return -1;
>+        }
>+    } while (rc != suspend_evtchn);
>+
>+    /* harmless for one-off suspend */
>+    if (xc_evtchn_unmask(xce, suspend_evtchn) < 0)
>+        ERROR("failed to unmask suspend notification channel: 
>%d", rc);
>+
>+    return 0;
>+}
>+
>+int xc_suspend_evtchn_release(int xce, int suspend_evtchn)
>+{
>+    if (suspend_evtchn >= 0)
>+        xc_evtchn_unbind(xce, suspend_evtchn);
>+
>+    return unlock_suspend_event();
>+}
>+
>+int xc_suspend_evtchn_init(int xc, int xce, int domid, int port)
>+{
>+    int rc, suspend_evtchn = -1;
>+
>+    if (lock_suspend_event())
>+        return -EINVAL;
>+
>+    suspend_evtchn = xc_evtchn_bind_interdomain(xce, domid, port);
>+    if (suspend_evtchn < 0) {
>+        ERROR("failed to bind suspend event channel: %d", 
>suspend_evtchn);
>+        goto cleanup;
>+    }
>+
>+    rc = xc_domain_subscribe_for_suspend(xc, domid, port);
>+    if (rc < 0) {
>+        ERROR("failed to subscribe to domain: %d", rc);
>+        goto cleanup;
>+    }
>+
>+    /* event channel is pending immediately after binding */
>+    xc_await_suspend(xce, suspend_evtchn);
>+
>+    return suspend_evtchn;
>+
>+cleanup:
>+    if (suspend_evtchn > 0)
>+        xc_suspend_evtchn_release(xce, suspend_evtchn);
>+
>+    return -1;
>+}
>
>-- 
>yamahata
>
_______________________________________________
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®.