[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 18/27] tools/libxl: Convert a legacy stream if needed
Andrew Cooper writes ("[PATCH v2 18/27] tools/libxl: Convert a legacy stream if needed"): > For backwards compatibility, a legacy stream needs converting before it can be > read by the v2 stream logic. > > This causes the v2 stream logic to need to juggle two parallel tasks. > check_stream_finished() is introduced for the purpose of joining the tasks in > both success and error cases. > > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx> > CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> > CC: Wei Liu <wei.liu2@xxxxxxxxxx> > --- > tools/libxl/libxl_internal.h | 7 +++ > tools/libxl/libxl_stream_read.c | 98 > ++++++++++++++++++++++++++++++++++++++- > 2 files changed, 104 insertions(+), 1 deletion(-) > > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index 68e7f02..1cf1884 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -3274,6 +3274,7 @@ struct libxl__stream_read_state { > /* filled by the user */ > libxl__ao *ao; > int fd; > + bool legacy; > void (*completion_callback)(libxl__egc *egc, > libxl__stream_read_state *srs, > int rc); > @@ -3281,6 +3282,12 @@ struct libxl__stream_read_state { > int rc; > bool running; > > + /* Active-stuff handling */ > + int joined_rc; > + > + /* Conversion helper */ > + libxl__carefd *v2_carefd; This needs proper documentation of what states this is valid in. See my observations on 16/ about this. I would expect that this patch would add appropriate commentary documenting the invariants/states/whatever for these. > +static void check_stream_finished(libxl__egc *egc, > + libxl__stream_read_state *stream, > + int rc, const char *what) > +{ > + libxl__domain_create_state *dcs = CONTAINER_OF(stream, *dcs, srs); > + STATE_AO_GC(stream->ao); > + > + LOG(DEBUG, "Task '%s' joining (rc %d)", what, rc); > + > + if (rc && !stream->joined_rc) { > + bool skip = false; > + /* First reported failure from joining tasks. Tear everything down > */ > + stream->joined_rc = rc; This function has room for improvement, I think. * You compute libxl__stream_read_inuse(&dcs->srs) || libxl__convert_legacy_stream_inuse(&dcs->chs) twice, once in the if (rc ...) and once in the straight line. You could combine these. * I think libxl__blah_abort are all no-ops on initialised but inactive objects. (Ie, objects in state Idle.) So you can call them unconditionally. * I don't think joined_rc is particularly helpful. Why not simply combine the incoming rc with the existing rc ? That is, if nothing has gone wrong already, set the rc to the incoming one; otherwise keep the existing rc. That assumes that the best rc value to report is the one from the first detected problem, which is probably correct. (Consider ERROR_ABORTED.) > +#if defined(__x86_64__) || defined(__i386__) > +static void conversion_done(libxl__egc *egc, > + libxl__conversion_helper_state *chs, int rc) > +{ > + STATE_AO_GC(chs->ao); > + libxl__domain_create_state *dcs = CONTAINER_OF(chs, *dcs, chs); > + > + check_stream_finished(egc, &dcs->srs, rc, "conversion"); > +} > +#endif Again, I would prefer to avoid the ifdeffery if it's not terribly awkward to do the other way (see libxl_no*.c for some examples). If you do invent ifdeffery it should definitely have its own #define to trigger off, rather than directly using __x86_64__ etc. Thanks, Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |