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
|