[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3 of 6 V3] libxl: QMP stop/resume & refactor QEMU suspend/resume/save
On Fri, 2012-02-03 at 06:49 +0000, rshriram@xxxxxxxxx wrote: > # HG changeset patch > # User Shriram Rajagopalan <rshriram@xxxxxxxxx> > # Date 1328251593 28800 > # Node ID 329b3c94c618addb1e802cebc7fe23b12b432398 > # Parent 636da26c40d37b84a93b6a6c3881b2fccc768aa2 > 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> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > > diff -r 636da26c40d3 -r 329b3c94c618 tools/libxl/libxl_dom.c > --- a/tools/libxl/libxl_dom.c Thu Feb 02 22:46:33 2012 -0800 > +++ b/tools/libxl/libxl_dom.c Thu Feb 02 22:46:33 2012 -0800 > @@ -488,6 +488,54 @@ 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; > + 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; > + /* Save DM state into filename */ > + ret = libxl__qmp_save(gc, domid, filename); > + if (ret) > + unlink(filename); > + 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"); > + libxl__wait_for_device_model(gc, domid, "running", NULL, NULL, NULL); > + 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; > @@ -517,7 +565,7 @@ static int libxl__domain_suspend_common_ > return 0; > } > si->guest_responded = 1; > - return 1; > + goto guest_suspended; > } > > if (si->hvm && (!hvm_pvdrv || hvm_s_state)) { > @@ -595,7 +643,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 guest_suspended; > } > } > > @@ -604,6 +652,17 @@ static int libxl__domain_suspend_common_ > > LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "guest did not suspend"); > return 0; > + > + guest_suspended: > + 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; > } > > static int libxl__toolstack_save(uint32_t domid, uint8_t **buf, > @@ -768,23 +827,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: > - ret = libxl__qmp_save(gc, domid, (char *)filename); > - if (ret) > - goto out; > - 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 636da26c40d3 -r 329b3c94c618 tools/libxl/libxl_internal.h > --- a/tools/libxl/libxl_internal.h Thu Feb 02 22:46:33 2012 -0800 > +++ b/tools/libxl/libxl_internal.h Thu Feb 02 22:46: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_save(libxl__gc *gc, int domid, const char *filename); > /* close and free the QMP handler */ > diff -r 636da26c40d3 -r 329b3c94c618 tools/libxl/libxl_qmp.c > --- a/tools/libxl/libxl_qmp.c Thu Feb 02 22:46:33 2012 -0800 > +++ b/tools/libxl/libxl_qmp.c Thu Feb 02 22:46:33 2012 -0800 > @@ -802,6 +802,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 |