[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |