[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3 of 6 V2] libxl: QMP stop/resume & refactor QEMU suspend/resume/save
# HG changeset patch # User Shriram Rajagopalan <rshriram@xxxxxxxxx> # Date 1328070813 28800 # Node ID 3ca830009da79443bb445d983a34f5f78664cdf4 # Parent 9f0a67bd54db89a23078913db578df72c5dba2e3 libxl: QMP stop/resume & refactor QEMU suspend/resume/save Implement QMP stop and resume functionality and split device model save into 3 parts: suspend_dm(domid) save_dm(domid, fd) resume_dm(domid) Integrate Device model suspend into suspend_common_callback Signed-off-by: Shriram Rajagopalan <rshriram@xxxxxxxxx> diff -r 9f0a67bd54db -r 3ca830009da7 tools/libxl/libxl_dom.c --- a/tools/libxl/libxl_dom.c Tue Jan 31 20:33:33 2012 -0800 +++ b/tools/libxl/libxl_dom.c Tue Jan 31 20:33:33 2012 -0800 @@ -425,6 +425,61 @@ static int libxl__domain_suspend_common_ return rc ? 0 : 1; } +int libxl__domain_suspend_device_model(libxl__gc *gc, uint32_t domid) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + int ret = 0, fd2 = -1; + const char *filename = libxl__device_model_savefile(gc, domid); + + switch (libxl__device_model_version_running(gc, domid)) { + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: { + LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, + "Saving device model state to %s", filename); + libxl__qemu_traditional_cmd(gc, domid, "save"); + libxl__wait_for_device_model(gc, domid, "paused", NULL, NULL, NULL); + break; + } + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: + if (libxl__qmp_stop(gc, domid)) + return ERROR_FAIL; + fd2 = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd2 < 0) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, + "Unable to create a QEMU save file\n"); + return ERROR_FAIL; + } + /* Save DM state into fd2 */ + ret = libxl__qmp_migrate(gc, domid, fd2); + if (ret) + unlink(filename); + close(fd2); + fd2 = -1; + break; + default: + return ERROR_INVAL; + } + + return ret; +} + +int libxl__domain_resume_device_model(libxl__gc *gc, uint32_t domid) +{ + + switch (libxl__device_model_version_running(gc, domid)) { + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: { + libxl__qemu_traditional_cmd(gc, domid, "continue"); + break; + } + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: + if (libxl__qmp_resume(gc, domid)) + return ERROR_FAIL; + default: + return ERROR_INVAL; + } + + return 0; +} + static int libxl__domain_suspend_common_callback(void *data) { struct suspendinfo *si = data; @@ -454,7 +509,7 @@ static int libxl__domain_suspend_common_ return 0; } si->guest_responded = 1; - return 1; + goto suspend_dm; } if (si->hvm && (!hvm_pvdrv || hvm_s_state)) { @@ -532,7 +587,7 @@ static int libxl__domain_suspend_common_ shutdown_reason = (info.flags >> XEN_DOMINF_shutdownshift) & XEN_DOMINF_shutdownmask; if (shutdown_reason == SHUTDOWN_suspend) { LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "guest has suspended"); - return 1; + goto suspend_dm; } } @@ -541,6 +596,17 @@ static int libxl__domain_suspend_common_ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "guest did not suspend"); return 0; + + suspend_dm: + if (si->hvm) { + ret = libxl__domain_suspend_device_model(si->gc, si->domid); + if (ret) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, + "libxl__domain_suspend_device_model failed ret=%d", ret); + return 0; + } + } + return 1; } int libxl__domain_suspend_common(libxl__gc *gc, uint32_t domid, int fd, @@ -638,32 +704,6 @@ int libxl__domain_save_device_model(libx struct stat st; uint32_t qemu_state_len; - switch (libxl__device_model_version_running(gc, domid)) { - case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: { - LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, - "Saving device model state to %s", filename); - libxl__qemu_traditional_cmd(gc, domid, "save"); - libxl__wait_for_device_model(gc, domid, "paused", NULL, NULL, NULL); - break; - } - case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: - fd2 = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); - if (fd2 < 0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, - "Unable to create a QEMU save file\n"); - return ERROR_FAIL; - } - /* Save DM state into fd2 */ - ret = libxl__qmp_migrate(gc, domid, fd2); - if (ret) - goto out; - close(fd2); - fd2 = -1; - break; - default: - return ERROR_INVAL; - } - if (stat(filename, &st) < 0) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to stat qemu save file\n"); diff -r 9f0a67bd54db -r 3ca830009da7 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Jan 31 20:33:33 2012 -0800 +++ b/tools/libxl/libxl_internal.h Tue Jan 31 20:33:33 2012 -0800 @@ -277,6 +277,8 @@ _hidden int libxl__domain_suspend_common libxl_domain_type type, int live, int debug); _hidden const char *libxl__device_model_savefile(libxl__gc *gc, uint32_t domid); +_hidden int libxl__domain_suspend_device_model(libxl__gc *gc, uint32_t domid); +_hidden int libxl__domain_resume_device_model(libxl__gc *gc, uint32_t domid); _hidden int libxl__domain_save_device_model(libxl__gc *gc, uint32_t domid, int fd); _hidden void libxl__userdata_destroyall(libxl__gc *gc, uint32_t domid); @@ -620,6 +622,10 @@ _hidden int libxl__qmp_query_serial(libx _hidden int libxl__qmp_pci_add(libxl__gc *gc, int d, libxl_device_pci *pcidev); _hidden int libxl__qmp_pci_del(libxl__gc *gc, int domid, libxl_device_pci *pcidev); +/* Suspend QEMU. */ +_hidden int libxl__qmp_stop(libxl__gc *gc, int domid); +/* Resume QEMU. */ +_hidden int libxl__qmp_resume(libxl__gc *gc, int domid); /* Save current QEMU state into fd. */ _hidden int libxl__qmp_migrate(libxl__gc *gc, int domid, int fd); /* close and free the QMP handler */ diff -r 9f0a67bd54db -r 3ca830009da7 tools/libxl/libxl_qmp.c --- a/tools/libxl/libxl_qmp.c Tue Jan 31 20:33:33 2012 -0800 +++ b/tools/libxl/libxl_qmp.c Tue Jan 31 20:33:33 2012 -0800 @@ -878,6 +878,38 @@ out: return rc; } +int libxl__qmp_stop(libxl__gc *gc, int domid) +{ + libxl__qmp_handler *qmp = NULL; + int rc = 0; + + qmp = libxl__qmp_initialize(libxl__gc_owner(gc), domid); + if (!qmp) + return ERROR_FAIL; + + rc = qmp_synchronous_send(qmp, "stop", NULL, + NULL, NULL, qmp->timeout); + + libxl__qmp_close(qmp); + return rc; +} + +int libxl__qmp_resume(libxl__gc *gc, int domid) +{ + libxl__qmp_handler *qmp = NULL; + int rc = 0; + + qmp = libxl__qmp_initialize(libxl__gc_owner(gc), domid); + if (!qmp) + return ERROR_FAIL; + + rc = qmp_synchronous_send(qmp, "cont", NULL, + NULL, NULL, qmp->timeout); + + libxl__qmp_close(qmp); + return rc; +} + int libxl__qmp_initializations(libxl_ctx *ctx, uint32_t domid) { libxl__qmp_handler *qmp = NULL; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |