# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1237877729 0
# Node ID 0b13d9787622d5e1d447a21657394805bb96d26f
# Parent 0477f9061c8a751a22975e11c53764b919dfb4c4
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>
---
tools/libxc/Makefile | 2
tools/libxc/xc_domain_save.c | 109 ----------------------------------------
tools/libxc/xc_suspend.c | 117 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 118 insertions(+), 110 deletions(-)
diff -r 0477f9061c8a -r 0b13d9787622 tools/libxc/Makefile
--- a/tools/libxc/Makefile Fri Mar 20 17:42:46 2009 +0000
+++ b/tools/libxc/Makefile Tue Mar 24 06:55:29 2009 +0000
@@ -29,7 +29,7 @@ CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.
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 -r 0477f9061c8a -r 0b13d9787622 tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c Fri Mar 20 17:42:46 2009 +0000
+++ b/tools/libxc/xc_domain_save.c Tue Mar 24 06:55:29 2009 +0000
@@ -742,115 +742,6 @@ static xen_pfn_t *map_and_save_p2m_table
free(p2m_frame_list);
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,
diff -r 0477f9061c8a -r 0b13d9787622 tools/libxc/xc_suspend.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_suspend.c Tue Mar 24 06:55:29 2009 +0000
@@ -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;
+}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|