[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxc: fix link error of xc_save on ia64
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |