From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Jackson Subject: [PATCH 04/29] libxl: suspend: common suspend callbacks take rc Date: Tue, 10 Feb 2015 20:09:51 +0000 Message-ID: <1423599016-32639-5-git-send-email-ian.jackson@eu.citrix.com> References: <1423599016-32639-1-git-send-email-ian.jackson@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1423599016-32639-1-git-send-email-ian.jackson@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: Ian Jackson , Euan Harris List-Id: xen-devel@lists.xenproject.org Change the following functions to take a libxl error code rather than a boolean "ok" value, and translate that value to the boolean expected by libxc at the last moment: domain_suspend_callback_common_done } dss->callback_common_done remus_domain_suspend_callback_common_done } domain_suspend_common_done Also, abolish domain_suspend_common_failed as domain_suspend_common_done can easily do its job and the call sites now have to supply the right rc value anyway. In domain_suspend_common_guest_suspended, change "ret" to "rc" as it contains a libxl error code. There is no functional change in this patch: the proper rc value now propagates further, but is still eventually smashed to a boolean. Signed-off-by: Ian Jackson --- v2: Fix a leftover comment referring to domain_suspend_common_failed --- tools/libxl/libxl_dom.c | 54 +++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 010061e..9971cdc 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -930,7 +930,7 @@ 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); + libxl__domain_suspend_state *dss, int rc); /*----- complicated callback, called by xc_domain_save -----*/ @@ -1217,11 +1217,9 @@ static void suspend_common_wait_guest_check(libxl__egc *egc, static void suspend_common_wait_guest_timeout(libxl__egc *egc, libxl__ev_time *ev, const struct timeval *requested_abs); -static void domain_suspend_common_failed(libxl__egc *egc, - libxl__domain_suspend_state *dss); static void domain_suspend_common_done(libxl__egc *egc, libxl__domain_suspend_state *dss, - bool ok); + int rc); static bool domain_suspend_pvcontrol_acked(const char *state) { /* any value other than "suspend", including ENOENT (i.e. !state), is OK */ @@ -1251,6 +1249,7 @@ static void domain_suspend_callback_common(libxl__egc *egc, ret = xc_evtchn_notify(CTX->xce, dss->guest_evtchn.port); if (ret < 0) { LOG(ERROR, "xc_evtchn_notify failed ret=%d", ret); + rc = ERROR_FAIL; goto err; } @@ -1271,6 +1270,7 @@ static void domain_suspend_callback_common(libxl__egc *egc, ret = xc_domain_shutdown(CTX->xch, domid, SHUTDOWN_suspend); if (ret < 0) { LOGE(ERROR, "xc_domain_shutdown failed"); + rc = ERROR_FAIL; goto err; } /* The guest does not (need to) respond to this sort of request. */ @@ -1285,7 +1285,7 @@ static void domain_suspend_callback_common(libxl__egc *egc, libxl__domain_pvcontrol_write(gc, XBT_NULL, domid, "suspend"); dss->pvcontrol.path = libxl__domain_pvcontrol_xspath(gc, domid); - if (!dss->pvcontrol.path) goto err; + if (!dss->pvcontrol.path) { rc = ERROR_FAIL; goto err; } dss->pvcontrol.ao = ao; dss->pvcontrol.what = "guest acknowledgement of suspend request"; @@ -1295,7 +1295,7 @@ static void domain_suspend_callback_common(libxl__egc *egc, return; err: - domain_suspend_common_failed(egc, dss); + domain_suspend_common_done(egc, dss, rc); } static void domain_suspend_common_wait_guest_evtchn(libxl__egc *egc, @@ -1305,8 +1305,8 @@ static void domain_suspend_common_wait_guest_evtchn(libxl__egc *egc, STATE_AO_GC(dss->ao); /* If we should be done waiting, suspend_common_wait_guest_check * will end up calling domain_suspend_common_guest_suspended or - * domain_suspend_common_failed, both of which cancel the evtchn - * wait. So re-enable it now. */ + * domain_suspend_common_done, both of which cancel the evtchn + * wait as needed. So re-enable it now. */ libxl__ev_evtchn_wait(gc, &dss->guest_evtchn); suspend_common_wait_guest_check(egc, dss); } @@ -1371,7 +1371,7 @@ static void domain_suspend_common_pvcontrol_suspending(libxl__egc *egc, err: libxl__xs_transaction_abort(gc, &t); - domain_suspend_common_failed(egc, dss); + domain_suspend_common_done(egc, dss, rc); return; } @@ -1395,7 +1395,7 @@ static void domain_suspend_common_wait_guest(libxl__egc *egc, return; err: - domain_suspend_common_failed(egc, dss); + domain_suspend_common_done(egc, dss, rc); } static void suspend_common_wait_guest_watch(libxl__egc *egc, @@ -1445,7 +1445,7 @@ static void suspend_common_wait_guest_check(libxl__egc *egc, return; err: - domain_suspend_common_failed(egc, dss); + domain_suspend_common_done(egc, dss, ERROR_FAIL); } static void suspend_common_wait_guest_timeout(libxl__egc *egc, @@ -1454,46 +1454,40 @@ static void suspend_common_wait_guest_timeout(libxl__egc *egc, libxl__domain_suspend_state *dss = CONTAINER_OF(ev, *dss, guest_timeout); STATE_AO_GC(dss->ao); LOG(ERROR, "guest did not suspend, timed out"); - domain_suspend_common_failed(egc, dss); + domain_suspend_common_done(egc, dss, ERROR_GUEST_TIMEDOUT); } static void domain_suspend_common_guest_suspended(libxl__egc *egc, libxl__domain_suspend_state *dss) { STATE_AO_GC(dss->ao); - int ret; + int rc; libxl__ev_evtchn_cancel(gc, &dss->guest_evtchn); libxl__ev_xswatch_deregister(gc, &dss->guest_watch); libxl__ev_time_deregister(gc, &dss->guest_timeout); if (dss->hvm) { - ret = libxl__domain_suspend_device_model(gc, dss); - if (ret) { - LOG(ERROR, "libxl__domain_suspend_device_model failed ret=%d", ret); - domain_suspend_common_failed(egc, dss); + rc = libxl__domain_suspend_device_model(gc, dss); + if (rc) { + LOG(ERROR, "libxl__domain_suspend_device_model failed ret=%d", rc); + domain_suspend_common_done(egc, dss, rc); return; } } - domain_suspend_common_done(egc, dss, 1); -} - -static void domain_suspend_common_failed(libxl__egc *egc, - libxl__domain_suspend_state *dss) -{ domain_suspend_common_done(egc, dss, 0); } static void domain_suspend_common_done(libxl__egc *egc, libxl__domain_suspend_state *dss, - bool ok) + int rc) { EGC_GC; assert(!libxl__xswait_inuse(&dss->pvcontrol)); libxl__ev_evtchn_cancel(gc, &dss->guest_evtchn); libxl__ev_xswatch_deregister(gc, &dss->guest_watch); libxl__ev_time_deregister(gc, &dss->guest_timeout); - dss->callback_common_done(egc, dss, ok); + dss->callback_common_done(egc, dss, rc); } static inline char *physmap_path(libxl__gc *gc, uint32_t domid, @@ -1591,9 +1585,9 @@ static void libxl__domain_suspend_callback(void *data) } static void domain_suspend_callback_common_done(libxl__egc *egc, - libxl__domain_suspend_state *dss, int ok) + libxl__domain_suspend_state *dss, int rc) { - libxl__xc_domain_saverestore_async_callback_done(egc, &dss->shs, ok); + libxl__xc_domain_saverestore_async_callback_done(egc, &dss->shs, !rc); } /*----- remus callbacks -----*/ @@ -1617,9 +1611,9 @@ static void libxl__remus_domain_suspend_callback(void *data) } static void remus_domain_suspend_callback_common_done(libxl__egc *egc, - libxl__domain_suspend_state *dss, int ok) + libxl__domain_suspend_state *dss, int rc) { - if (!ok) + if (rc) goto out; libxl__remus_devices_state *const rds = &dss->rds; @@ -1628,7 +1622,7 @@ static void remus_domain_suspend_callback_common_done(libxl__egc *egc, return; out: - libxl__xc_domain_saverestore_async_callback_done(egc, &dss->shs, ok); + libxl__xc_domain_saverestore_async_callback_done(egc, &dss->shs, !rc); } static void remus_devices_postsuspend_cb(libxl__egc *egc, -- 1.7.10.4