From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: [PATCH v4 07/29] tools/libxl: Extra management APIs for the save helper Date: Tue, 14 Jul 2015 11:59:22 +0100 Message-ID: <1436871584-6522-8-git-send-email-andrew.cooper3@citrix.com> References: <1436871584-6522-1-git-send-email-andrew.cooper3@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1436871584-6522-1-git-send-email-andrew.cooper3@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 Cc: Andrew Cooper , Ian Jackson , Wei Liu List-Id: xen-devel@lists.xenproject.org With migration v2, there are several moving parts needing to be juggled at once. This requires the error handling logic to be able to query the state of each moving part, possibly before they have been started, and be able to cancel them. Signed-off-by: Andrew Cooper Acked-by: Ian Campbell CC: Ian Jackson CC: Wei Liu --- v4: Don't force _init() to be mandatory v3: Adjust helper_{stop,failed,done} to use libxl__save_helper_inuse() v2: Add an _init() function which allows _inuse() to be safe to call even before the save helper has started. --- tools/libxl/libxl_internal.h | 9 +++++++++ tools/libxl/libxl_save_callout.c | 23 +++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index e5599a3..8ce3d49 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3272,6 +3272,15 @@ _hidden void libxl__xc_domain_restore(libxl__egc *egc, _hidden void libxl__xc_domain_restore_done(libxl__egc *egc, void *dcs_void, int rc, int retval, int errnoval); +_hidden void libxl__save_helper_init(libxl__save_helper_state *shs); +_hidden void libxl__save_helper_abort(libxl__egc *egc, + libxl__save_helper_state *shs); + +static inline bool libxl__save_helper_inuse(const libxl__save_helper_state *shs) +{ + return libxl__ev_child_inuse(&shs->child); +} + /* Each time the dm needs to be saved, we must call suspend and then save */ _hidden int libxl__domain_suspend_device_model(libxl__gc *gc, libxl__domain_suspend_state *dss); diff --git a/tools/libxl/libxl_save_callout.c b/tools/libxl/libxl_save_callout.c index 1136b79..c56b68c 100644 --- a/tools/libxl/libxl_save_callout.c +++ b/tools/libxl/libxl_save_callout.c @@ -146,6 +146,13 @@ void libxl__xc_domain_saverestore_async_callback_done(libxl__egc *egc, shs->egc = 0; } +void libxl__save_helper_init(libxl__save_helper_state *shs) +{ + libxl__ao_abortable_init(&shs->abrt); + libxl__ev_fd_init(&shs->readable); + libxl__ev_child_init(&shs->child); +} + /*----- helper execution -----*/ static void run_helper(libxl__egc *egc, libxl__save_helper_state *shs, @@ -167,9 +174,7 @@ static void run_helper(libxl__egc *egc, libxl__save_helper_state *shs, shs->rc = 0; shs->completed = 0; shs->pipes[0] = shs->pipes[1] = 0; - libxl__ao_abortable_init(&shs->abrt); - libxl__ev_fd_init(&shs->readable); - libxl__ev_child_init(&shs->child); + libxl__save_helper_init(shs); shs->abrt.ao = shs->ao; shs->abrt.callback = helper_stop; @@ -255,7 +260,7 @@ static void helper_failed(libxl__egc *egc, libxl__save_helper_state *shs, libxl__ev_fd_deregister(gc, &shs->readable); - if (!libxl__ev_child_inuse(&shs->child)) { + if (!libxl__save_helper_inuse(shs)) { helper_done(egc, shs); return; } @@ -268,7 +273,7 @@ static void helper_stop(libxl__egc *egc, libxl__ao_abortable *abrt, int rc) libxl__save_helper_state *shs = CONTAINER_OF(abrt, *shs, abrt); STATE_AO_GC(shs->ao); - if (!libxl__ev_child_inuse(&shs->child)) { + if (!libxl__save_helper_inuse(shs)) { helper_failed(egc, shs, rc); return; } @@ -279,6 +284,12 @@ static void helper_stop(libxl__egc *egc, libxl__ao_abortable *abrt, int rc) libxl__kill(gc, shs->child.pid, SIGTERM, "save/restore helper"); } +void libxl__save_helper_abort(libxl__egc *egc, + libxl__save_helper_state *shs) +{ + helper_stop(egc, &shs->abrt, ERROR_FAIL); +} + static void helper_stdout_readable(libxl__egc *egc, libxl__ev_fd *ev, int fd, short events, short revents) { @@ -356,7 +367,7 @@ static void helper_done(libxl__egc *egc, libxl__save_helper_state *shs) libxl__ev_fd_deregister(gc, &shs->readable); libxl__carefd_close(shs->pipes[0]); shs->pipes[0] = 0; libxl__carefd_close(shs->pipes[1]); shs->pipes[1] = 0; - assert(!libxl__ev_child_inuse(&shs->child)); + assert(!libxl__save_helper_inuse(shs)); if (shs->toolstack_data_file) fclose(shs->toolstack_data_file); shs->egc = egc; -- 1.7.10.4