[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 17/28] tools/libxl: Infrastructure for reading a libxl migration v2 stream
On 13/07/15 14:42, Ian Campbell wrote: > On Mon, 2015-07-13 at 13:01 +0100, Andrew Cooper wrote: > >> +void libxl__stream_read_start(libxl__egc *egc, >> + libxl__stream_read_state *stream) >> +{ >> + libxl__datacopier_state *dc = &stream->dc; >> + int rc = 0; >> + >> + stream->running = true; > Did you drop the assert prior to this on purpose? I think it got lost while splitting the _init() out. I shall re-introduce. > >> + >> +static void stream_header_done(libxl__egc *egc, >> + libxl__datacopier_state *dc, >> + int rc, int onwrite, int errnoval) >> +{ >> + libxl__stream_read_state *stream = CONTAINER_OF(dc, *stream, dc); >> + libxl__sr_hdr *hdr = &stream->hdr; >> + STATE_AO_GC(dc->ao); >> + >> + if (rc || onwrite || errnoval) { >> + rc = ERROR_FAIL; > Sorry for not noticing this before but if we come here because of rc > then this clobbers the existing value, which I think is undesirable. > > So I think the "if (rc) goto err" should be pulled out of this check. > (the one line form is acceptable in this case). > > This no doubt applies to most of these functions. Urgh yes - I fixed this in some places (mostly in the write side infrastructure) but forgot to check for other occurrences. > >> +static void stream_continue(libxl__egc *egc, >> + libxl__stream_read_state *stream) >> +{ >> + STATE_AO_GC(stream->ao); >> + >> + /* >> + * Must not mutually recurse with process_record(). >> + * >> + * For records whose processing function is synchronous >> + * (e.g. TOOLSTACK), process_record() does not start another async >> + * operation, and a further operation should be started. >> + * >> + * A naive solution, which would function in general, would be for >> + * process_record() to call stream_continue(). > Wouldn't the more obvious naive thing to do be to call > setup_read_record? That would also be a naive thing to do. During a remus checkpoint, by the time we are processing TOOLSTACK records, the next thing in the pipe is a libxc record. This is why everything must come back around to stream_continue() rather than attempting to be clever. > That's also potentially recursing I think since the > chain of callbacks may also end in a stream_continue. I am fairly sure the reentrancy guarantees prevent that. > >> However, this >> + * would allow the content of the stream to cause mutual >> + * recursion, and possibly for us to fall off our stack. >> + * >> + * Instead, process_record() indicates with its return value >> + * whether it a further operation needs to start, and the > "whether it"? s/ it// ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |