[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 10/19] libxl: suspend: Async domain_suspend_callback_common
Make domain_suspend_callback_common do its work and then call dss->callback_common_done, rather than simply returning its answer. This is preparatory to abolishing the usleeps in this function and replacing them with use of the event machinery. No functional change. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> CC: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxl/libxl_dom.c | 46 ++++++++++++++++++++++++++++++------------ tools/libxl/libxl_internal.h | 4 +++- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 1c0f04f..39f06da 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -755,6 +755,10 @@ int libxl__toolstack_restore(uint32_t domid, const uint8_t *buf, static void domain_suspend_done(libxl__egc *egc, libxl__domain_suspend_state *dss, int rc); +static void domain_suspend_callback_common_done(libxl__egc *egc, + libxl__domain_suspend_state *dss, int ok); +static void remus_domain_suspend_callback_common_done(libxl__egc *egc, + libxl__domain_suspend_state *dss, int ok); /*----- complicated callback, called by xc_domain_save -----*/ @@ -1020,7 +1024,9 @@ int libxl__domain_resume_device_model(libxl__gc *gc, uint32_t domid) return 0; } -int libxl__domain_suspend_callback_common(libxl__domain_suspend_state *dss) +/* calls dss->callback_common_done when done */ +static void domain_suspend_callback_common(libxl__egc *egc, + libxl__domain_suspend_state *dss) { STATE_AO_GC(dss->ao); unsigned long hvm_s_state = 0, hvm_pvdrv = 0; @@ -1043,12 +1049,12 @@ int libxl__domain_suspend_callback_common(libxl__domain_suspend_state *dss) ret = xc_evtchn_notify(dss->xce, dss->suspend_eventchn); if (ret < 0) { LOG(ERROR, "xc_evtchn_notify failed ret=%d", ret); - return 0; + goto err; } ret = xc_await_suspend(CTX->xch, dss->xce, dss->suspend_eventchn); if (ret < 0) { LOG(ERROR, "xc_await_suspend failed ret=%d", ret); - return 0; + goto err; } dss->guest_responded = 1; goto guest_suspended; @@ -1059,7 +1065,7 @@ int libxl__domain_suspend_callback_common(libxl__domain_suspend_state *dss) ret = xc_domain_shutdown(CTX->xch, domid, SHUTDOWN_suspend); if (ret < 0) { LOGE(ERROR, "xc_domain_shutdown failed"); - return 0; + goto err; } /* The guest does not (need to) respond to this sort of request. */ dss->guest_responded = 1; @@ -1113,7 +1119,7 @@ int libxl__domain_suspend_callback_common(libxl__domain_suspend_state *dss) */ if (!strcmp(state, "suspend")) { LOG(ERROR, "guest didn't acknowledge suspend, request cancelled"); - return 0; + goto err; } LOG(DEBUG, "guest acknowledged suspend request"); @@ -1143,17 +1149,19 @@ int libxl__domain_suspend_callback_common(libxl__domain_suspend_state *dss) } LOG(ERROR, "guest did not suspend"); - return 0; + err: + dss->callback_common_done(egc, dss, 0); + return; guest_suspended: if (dss->hvm) { ret = libxl__domain_suspend_device_model(gc, dss); if (ret) { LOG(ERROR, "libxl__domain_suspend_device_model failed ret=%d", ret); - return 0; + goto err; } } - return 1; + dss->callback_common_done(egc, dss, 1); } static inline char *physmap_path(libxl__gc *gc, uint32_t domid, @@ -1246,10 +1254,16 @@ static void libxl__domain_suspend_callback(void *data) libxl__egc *egc = shs->egc; libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); - int ok = libxl__domain_suspend_callback_common(dss); - libxl__xc_domain_saverestore_async_callback_done(egc, shs, ok); + dss->callback_common_done = domain_suspend_callback_common_done; + domain_suspend_callback_common(egc, dss); } +static void domain_suspend_callback_common_done(libxl__egc *egc, + libxl__domain_suspend_state *dss, int ok) +{ + libxl__xc_domain_saverestore_async_callback_done(egc, &dss->shs, ok); +} + /*----- remus callbacks -----*/ static void libxl__remus_domain_suspend_callback(void *data) @@ -1258,11 +1272,17 @@ static void libxl__remus_domain_suspend_callback(void *data) libxl__egc *egc = shs->egc; libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); - /* REMUS TODO: Issue disk and network checkpoint reqs. */ - int ok = libxl__domain_suspend_callback_common(dss); - libxl__xc_domain_saverestore_async_callback_done(egc, shs, ok); + dss->callback_common_done = remus_domain_suspend_callback_common_done; + domain_suspend_callback_common(egc, dss); } +static void remus_domain_suspend_callback_common_done(libxl__egc *egc, + libxl__domain_suspend_state *dss, int ok) +{ + /* REMUS TODO: Issue disk and network checkpoint reqs. */ + libxl__xc_domain_saverestore_async_callback_done(egc, &dss->shs, ok); +} + static int libxl__remus_domain_resume_callback(void *data) { libxl__save_helper_state *shs = data; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index a32d75f..369a1b3 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2425,6 +2425,8 @@ struct libxl__domain_suspend_state { int interval; /* checkpoint interval (for Remus) */ libxl__save_helper_state shs; libxl__logdirty_switch logdirty; + void (*callback_common_done)(libxl__egc*, + struct libxl__domain_suspend_state*, int ok); /* private for libxl__domain_save_device_model */ libxl__save_device_model_cb *save_dm_callback; libxl__datacopier_state save_dm_datacopier; @@ -2717,7 +2719,7 @@ _hidden void libxl__xc_domain_save_done(libxl__egc*, void *dss_void, void libxl__xc_domain_saverestore_async_callback_done(libxl__egc *egc, libxl__save_helper_state *shs, int return_value); -_hidden int libxl__domain_suspend_callback_common(libxl__domain_suspend_state*); + _hidden void libxl__domain_suspend_common_switch_qemu_logdirty (int domid, unsigned int enable, void *data); _hidden int libxl__toolstack_save(uint32_t domid, uint8_t **buf, -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |