From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Jackson Subject: [PATCH 29/29] libxl: cancellation: Make datacopiers cancellable Date: Tue, 10 Feb 2015 20:10:16 +0000 Message-ID: <1423599016-32639-30-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 libxl__datacopier_* can now actually generate a callback with rc==CANCELLED. This provides cancellation during some corner cases, including (at least) copying the device model data during the end of domain save. Signed-off-by: Ian Jackson --- v2: New in this version of the series. --- tools/libxl/libxl_aoutils.c | 16 ++++++++++++++++ tools/libxl/libxl_internal.h | 1 + 2 files changed, 17 insertions(+) diff --git a/tools/libxl/libxl_aoutils.c b/tools/libxl/libxl_aoutils.c index ece7981..919bf12 100644 --- a/tools/libxl/libxl_aoutils.c +++ b/tools/libxl/libxl_aoutils.c @@ -103,6 +103,7 @@ static void xswait_report_error(libxl__egc *egc, libxl__xswait_state *xswa, void libxl__datacopier_init(libxl__datacopier_state *dc) { assert(dc->ao); + libxl__ao_cancellable_init(&dc->cancel); libxl__ev_fd_init(&dc->toread); libxl__ev_fd_init(&dc->towrite); LIBXL_TAILQ_INIT(&dc->bufs); @@ -113,6 +114,7 @@ void libxl__datacopier_kill(libxl__datacopier_state *dc) STATE_AO_GC(dc->ao); libxl__datacopier_buf *buf, *tbuf; + libxl__ao_cancellable_deregister(&dc->cancel); libxl__ev_fd_deregister(gc, &dc->toread); libxl__ev_fd_deregister(gc, &dc->towrite); LIBXL_TAILQ_FOREACH_SAFE(buf, &dc->bufs, entry, tbuf) @@ -196,6 +198,15 @@ static int datacopier_pollhup_handled(libxl__egc *egc, return 0; } +static void datacopier_cancel(libxl__egc *egc, libxl__ao_cancellable *cancel, + int rc) +{ + libxl__datacopier_state *dc = CONTAINER_OF(cancel, *dc, cancel); + STATE_AO_GC(dc->ao); + + datacopier_callback(egc, dc, rc, -1, 0); +} + static void datacopier_readable(libxl__egc *egc, libxl__ev_fd *ev, int fd, short events, short revents) { libxl__datacopier_state *dc = CONTAINER_OF(ev, *dc, toread); @@ -312,6 +323,11 @@ int libxl__datacopier_start(libxl__datacopier_state *dc) libxl__datacopier_init(dc); + dc->cancel.ao = ao; + dc->cancel.callback = datacopier_cancel; + rc = libxl__ao_cancellable_register(&dc->cancel); + if (rc) goto out; + rc = libxl__ev_fd_register(gc, &dc->toread, datacopier_readable, dc->readfd, POLLIN); if (rc) goto out; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 29a612c..9d9f376 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2594,6 +2594,7 @@ struct libxl__datacopier_state { libxl__datacopier_callback *callback; libxl__datacopier_callback *callback_pollhup; /* remaining fields are private to datacopier */ + libxl__ao_cancellable cancel; libxl__ev_fd toread, towrite; ssize_t used; LIBXL_TAILQ_HEAD(libxl__datacopier_bufs, libxl__datacopier_buf) bufs; -- 1.7.10.4