[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 16/27] tools/libxl: Infrastructure for reading a libxl migration v2 stream



On Fri, 2015-07-10 at 11:47 +0100, Andrew Cooper wrote:

> >> +void libxl__stream_read_start(libxl__egc *egc,
> >> +                              libxl__stream_read_state *stream)
> >> +{
> >> +    libxl__datacopier_state *dc = &stream->dc;
> >> +    int ret = 0;
> >> +
> >> +    /* State initialisation. */
> >> +    assert(!stream->running);
> > Since running is declared private and there is no _init function (I
> > think _start is effectively filling that role) I'm not sure that the
> > caller can necessarily be expected to have initialised anything other
> > than the ao, fd and callback fields.
> 
> It was a sanity check that _start() doesn't get called twice (guess what
> I managed to do while developing).  It can probably be dropped.
> 
> >
> > You might choose to handle this as a request for a doc comment ("must
> > call LIBXL_FILLZERO on it to init"), or to add a separate init function
> > containing the memset or to do away with this check. I've not gotten to
> > the caller yet so I don't know which you will prefer.
> 
> It is all zeroed because of the way dcs is constructed.  I suppose I can
> also drop the zeroing of the dc.

Got it. I think a comment that libxl__stream_read_state should be init'd
to zero would still be worthwhile, even if the actual implementation of
that happens implicitly through its containing type.

Then your sanity check could legitimately remain.

> >
> >> +
> >> +    stream->completion_callback(egc, stream, stream->rc);
> >> +}
> >> +
> >> +static void stream_continue(libxl__egc *egc,
> >> +                            libxl__stream_read_state *stream)
> >> +{
> >> +    STATE_AO_GC(stream->ao);
> >> +
> >> +    /* Must not mutually recurse with process_record() */
> >> +    assert(stream->recursion_guard == false);
> >> +    stream->recursion_guard = true;
> > This smells a bit like it ought to be a SRS_PHASE_PROCESSING or some
> > such, but lets leave that alone...
> 
> This check is pre-emptively avoid the naive bug which would occur if
> process_record() called back into stream_continue() and there were many
> TOOLSTACK records back to back in the processing queue.
> 
> In that case (and potentially future records as well), the two functions
> would mutually recurse based on the contents of the stream.

Do you mean they would do so legitimately in that case, or in error?

> >> +        goto err;
> >> +    }
> >> +
> >> +    hdr->ident   = be64toh(hdr->ident);
> >> +    hdr->version = be32toh(hdr->version);
> >> +    hdr->options = be32toh(hdr->options);
> >> +
> >> +    if (hdr->ident != RESTORE_STREAM_IDENT) {
> >> +        ret = ERROR_FAIL;
> > Eventually I suspect the xapi people would like to see something more
> > specific at least for the general "SRS header fail" if not the
> > individual reasons.
> 
> If you don't object too strongly, I would prefer to leave that
> bikeshedding to the error value improvements work.

I don't mind, it's easy enough to change from ERROR_FAIL to something
more specific.

You might incur the wrath of Rob/Euan though ;-)

> >
> > _If_ you've compile tested this for both 32- and 64-bit and it works we
> > could perhaps leave that audit until later.
> >
> >> +static void setup_read_record(libxl__egc *egc,
> >> +                              libxl__stream_read_state *stream)
> >> +{
> >> +    STATE_AO_GC(stream->ao);
> >> +    libxl__sr_record_buf *rec = NULL;
> >> +    int ret;
> >> +
> >> +    assert(stream->incoming_record == NULL);
> >> +
> >> +    stream->incoming_record = rec = libxl__zalloc(NOGC, sizeof(*rec));
> > I recall Ian J and you discussing NOGC allocations on IRC. Was the
> > conclusion that it was OK, or that it could be fixed later, or that it
> > should be fixed now via an nested ao or something similar?
> >
> > Unless the answer is "fixed now" I think the reason for the NOGC should
> > be in either the commit log or a comment (in the header, around about
> > the definition of the allocated data structure).
> 
> I will add a note about in the commit message.  We agreed on IRC that
> NOGC was OK.  It might be possible to switch to some nested ao later,
> but that depends entirely on the COLO work.

ACK. Please remember to say why it is ok, not just that it is.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.