[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 COLOPre 21/26] tools/libxl: refactor write stream to support back channel
From: Wen Congyang <wency@xxxxxxxxxxxxxx> Signed-off-by: Wen Congyang <wency@xxxxxxxxxxxxxx> --- tools/libxl/libxl_dom_save.c | 7 +++++-- tools/libxl/libxl_internal.h | 9 +++++---- tools/libxl/libxl_remus.c | 8 +++++--- tools/libxl/libxl_stream_write.c | 22 ++++++++++++++++++---- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/tools/libxl/libxl_dom_save.c b/tools/libxl/libxl_dom_save.c index 5797148..9a3b33d 100644 --- a/tools/libxl/libxl_dom_save.c +++ b/tools/libxl/libxl_dom_save.c @@ -30,7 +30,7 @@ struct libxl__physmap_info { /*========================= Domain save ============================*/ static void stream_done(libxl__egc *egc, - libxl__domain_save_state *dss, int rc); + libxl__stream_write_state *stream, int rc); static void domain_save_done(libxl__egc *egc, libxl__domain_save_state *dss, int rc); @@ -445,6 +445,7 @@ void libxl__domain_save(libxl__egc *egc, libxl__domain_save_state *dss) dss->sws.fd = dss->fd; dss->sws.ao = dss->ao; + dss->sws.back_channel = false; dss->sws.completion_callback = stream_done; libxl__stream_write_start(egc, &dss->sws); @@ -455,8 +456,10 @@ void libxl__domain_save(libxl__egc *egc, libxl__domain_save_state *dss) } static void stream_done(libxl__egc *egc, - libxl__domain_save_state *dss, int rc) + libxl__stream_write_state *stream, int rc) { + libxl__domain_save_state *dss = CONTAINER_OF(stream, *dss, sws); + domain_save_done(egc, dss, rc); } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 13d8271..82a327c 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2877,12 +2877,13 @@ struct libxl__stream_write_state { libxl__ao *ao; int fd; uint32_t domid; + bool back_channel; void (*completion_callback)(libxl__egc *egc, - libxl__domain_save_state *dss, - int rc); - void (*checkpoint_callback)(libxl__egc *egc, - libxl__domain_save_state *dss, + libxl__stream_write_state *stream, int rc); + void (*write_records_callback)(libxl__egc *egc, + libxl__stream_write_state *stream, + int rc); /* Private */ int rc; int joined_rc; diff --git a/tools/libxl/libxl_remus.c b/tools/libxl/libxl_remus.c index 01cc9e7..e143b21 100644 --- a/tools/libxl/libxl_remus.c +++ b/tools/libxl/libxl_remus.c @@ -205,7 +205,7 @@ out: /*----- remus asynchronous checkpoint callback -----*/ static void remus_checkpoint_stream_written( - libxl__egc *egc, libxl__domain_save_state *dss, int rc); + libxl__egc *egc, libxl__stream_write_state *stream, int rc); static void remus_devices_commit_cb(libxl__egc *egc, libxl__remus_devices_state *rds, int rc); @@ -219,13 +219,15 @@ void libxl__remus_domain_save_checkpoint_callback(void *data) libxl__egc *egc = dss->shs.egc; STATE_AO_GC(dss->ao); - dss->sws.checkpoint_callback = remus_checkpoint_stream_written; + dss->sws.write_records_callback = remus_checkpoint_stream_written; libxl__stream_write_start_checkpoint(egc, &dss->sws); } static void remus_checkpoint_stream_written( - libxl__egc *egc, libxl__domain_save_state *dss, int rc) + libxl__egc *egc, libxl__stream_write_state *stream, int rc) { + libxl__domain_save_state *dss = CONTAINER_OF(stream, *dss, sws); + /* Convenience aliases */ libxl__remus_devices_state *const rds = &dss->rds; diff --git a/tools/libxl/libxl_stream_write.c b/tools/libxl/libxl_stream_write.c index 1ebe306..3f981f0 100644 --- a/tools/libxl/libxl_stream_write.c +++ b/tools/libxl/libxl_stream_write.c @@ -48,6 +48,13 @@ * - Toolstack record * - if (hvm), Qemu record * - Checkpoint end record + * + * For back channel stream: + * - libxl__stream_write_start() + * - Set up the stream to running state + * + * - Add a new API to write the record. When the record is written + * out, call stream->write_records_callback() to return. */ static const uint8_t zero_padding[1U << REC_ALIGN_ORDER] = { 0 }; @@ -111,6 +118,9 @@ void libxl__stream_write_start(libxl__egc *egc, assert(!stream->running); stream->running = true; + if (stream->back_channel) + return; + memset(dc, 0, sizeof(*dc)); dc->readwhat = ""; dc->copywhat = "suspend header"; @@ -143,6 +153,7 @@ void libxl__stream_write_start_checkpoint(libxl__egc *egc, { assert(stream->running); assert(!stream->in_checkpoint); + assert(!stream->back_channel); stream->in_checkpoint = true; write_toolstack_record(egc, stream); @@ -178,6 +189,11 @@ static void stream_failed(libxl__egc *egc, return; } + if (stream->back_channel) { + stream->completion_callback(egc, stream, rc); + return; + } + if (stream->running) { stream->running = false; stream_done(egc, stream); @@ -231,7 +247,7 @@ static void check_stream_finished(libxl__egc *egc, LOG(DEBUG, "save/restore still in use"); else { LOG(INFO, "Join complete: result %d", stream->joined_rc); - stream->completion_callback(egc, dss, stream->joined_rc); + stream->completion_callback(egc, stream, stream->joined_rc); } } @@ -577,11 +593,9 @@ static void checkpoint_done(libxl__egc *egc, libxl__stream_write_state *stream, int rc) { - libxl__domain_save_state *dss = CONTAINER_OF(stream, *dss, sws); - assert(stream->in_checkpoint); stream->in_checkpoint = false; - stream->checkpoint_callback(egc, dss, rc); + stream->write_records_callback(egc, stream, rc); } static void write_checkpoint_end_record(libxl__egc *egc, -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |