[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [XEN PATCH for-4.13 v2 6/6] libxl_qmp: Have a lock for QMP socket access
Anthony PERARD writes ("[XEN PATCH for-4.13 v2 6/6] libxl_qmp: Have a lock for QMP socket access"): > Background: > This happens when attempting to create a guest with multiple > pci devices passthrough, libxl creates one connection per device to > attach and execute connect() on all at once before any single > connection has finished. > > To work around this, we use a new lock. Thanks again for tackling this. > Error handling of connect() and lock() is a bit awkward as > libxl__ev_qmp_send() doesn't allow to call the callback synchronously. > So we setup a timer to have a callback that has been called > asynchronously. We use the _abs variant it does strictly less than > _rel, thus avoiding unnecessary code that could return an error > (unnecessary because we only need to have the callback been called > ASAP). I have some problems with the approach here, I'm afraid. > This patch workaround the fact that it's not possible to connect > multiple time to a single QMP socket. QEMU listen on the socket with > a backlog value of 1, which mean that on Linux when concurrent thread > call connect() on the socket, they get EAGAIN. ... > * qmp_state External cfd efd id rx_buf* tx_buf* msg* > * disconnected Idle NULL Idle reset free free free > + * waiting_lock Active open Idle reset used free set > * connecting Active open IN reset used free set > * cap.neg Active open IN|OUT sent used cap_neg set > * cap.neg Active open IN sent used free set Don't `lock' and `time' need to be added to this table ? The table may become rather wide :-/. Maybe it could be compressed/abbreviated some more or maybe we'll just live with it becoming wider. > out: > - return rc; > + /* An error occurred and we need to let the caller know. At this > + * point, we can only do so via the callback. Unfortunately, the > + * callback of libxl__ev_slowlock_lock() might be called synchronously, > + * but libxl__ev_qmp_send() promise that it will not call the callback > + * synchronously. So we have to arrange to call the callback > + * asynchronously. */ > + ev->rc = rc; > + struct timeval now = { 0 }; > + rc = libxl__ev_time_register_abs(ev->ao, &ev->etime, > + lock_error_callback, now); > + /* If setting up the timer failed, there is no way to tell the caller > + * of libxl__ev_qmp_send() that the connection to the QMP socket > + * failed. But they are supposed to have a timer of their own. */ > + if (rc) > + LOGD(ERROR, ev->domid, > + "Failed to setup a callback call. rc=%d", rc); I don't think this is right. I think this callback has to be set up in a way that can't fail. But I think this is possible. We're free to allocate memory (although this may not be needed) and the egc (which we have) can contain callback pointers. I can see two approaches: 1. Invent a new libxl_ev_immediate_but_not_reentrant_callback (can't think of a good name right now). Add a new list head to the egc, and when you want to register a callback, put it on that list. Add the callback execution to egc_run_callbacks, probably at the top in a loop (since immediate callbacks may add more immediate callbacks). 2. Use libxl__ev_time; provide libxl__ev_time_register_now which cannot fail: it sets the abs time to 0 and skips the abortable stuff, and puts the libxl__ev_time on the front of the CTX etimes list. Have egc_run_callbacks run immediate timeouts: ie, if the head of the etimes list has abs time of 0, strip it, and call it. I think this involves some special handling of this case because you want to avoid messing about with the OSEVENT_HOOKs, so you probably need a new bit in libxl__ev_time. Otherwise time_deregister wouldn't know what to do. I think 1 is probably less confusing and less risky. It doesn't disturb, or get entangled in, the existing ev_time code; it doesn't involve pointlessly allocating an unused abortable. And it doesn't involve confusion over which error returns are possible where and which rc values must be kept and which discarded. Sorry, Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |