From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54475) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YROrb-0004DB-AX for qemu-devel@nongnu.org; Fri, 27 Feb 2015 12:38:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YROrY-0002dj-Ew for qemu-devel@nongnu.org; Fri, 27 Feb 2015 12:38:11 -0500 Received: from e39.co.us.ibm.com ([32.97.110.160]:49874) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YROrX-0002dU-I4 for qemu-devel@nongnu.org; Fri, 27 Feb 2015 12:38:07 -0500 Received: from /spool/local by e39.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 27 Feb 2015 10:38:06 -0700 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Roth In-Reply-To: <20150227053120.GD29409@voom.fritz.box> References: <1424096872-29868-1-git-send-email-mdroth@linux.vnet.ibm.com> <1424096872-29868-8-git-send-email-mdroth@linux.vnet.ibm.com> <20150224064032.GQ4536@voom.redhat.com> <20150224204345.31752.42274@loki> <20150225004823.GA15695@voom.fritz.box> <20150226222155.31752.51742@loki> <20150227053120.GD29409@voom.fritz.box> Message-ID: <20150227173756.433.98923@loki> Date: Fri, 27 Feb 2015 11:37:56 -0600 Subject: Re: [Qemu-devel] [PATCH v5 07/16] spapr_rtas: add ibm, configure-connector RTAS interface List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson Cc: aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, ncmike@ncultra.org, qemu-ppc@nongnu.org, tyreld@linux.vnet.ibm.com, bharata.rao@gmail.com, nfont@linux.vnet.ibm.com Quoting David Gibson (2015-02-26 23:31:20) > On Thu, Feb 26, 2015 at 04:21:55PM -0600, Michael Roth wrote: > > Quoting David Gibson (2015-02-24 18:48:23) > > > On Tue, Feb 24, 2015 at 02:43:45PM -0600, Michael Roth wrote: > > > > Quoting David Gibson (2015-02-24 00:40:32) > > > > > On Mon, Feb 16, 2015 at 08:27:43AM -0600, Michael Roth wrote: > [snip] > > > > > > + uint64_t wa_offset; > > > > > > + uint32_t drc_index; > > > > > > + sPAPRDRConnector *drc; > > > > > > + sPAPRDRConnectorClass *drck; > > > > > > + sPAPRDRCCResponse resp; > > > > > > + const struct fdt_property *prop =3D NULL; > > > > > > + char *prop_name =3D NULL; > > > > > > + int prop_len, rc; > > > > > > + > > > > > > + drc_index =3D rtas_ld(wa_addr, 0); > > > > > > + drc =3D spapr_dr_connector_by_index(drc_index); > > > > > > + if (!drc) { > > > > > > + DPRINTF("rtas_ibm_configure_connector: invalid sensor/= DRC index: %xh\n", > > > > > > + drc_index); > > > > > > + rc =3D RTAS_OUT_PARAM_ERROR; > > > > > > + goto out; > > > > > > + } > > > > > > + drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); > > > > > > + resp =3D drck->configure_connector(drc, &prop_name, &prop,= &prop_len); > > > > > = > > > > > You may have answered this last time round, but if so I forgot the > > > > > reason. > > > > > = > > > > > Why does the awkward iteration need to go down to the drck callba= ck? > > > > > Coudln't the drck callback part just supply the fdt fragment blob, > > > > > then have generic code which streams it out via iteration? > > > > > = > > > > > Obviously we have to support the horrid PAPR interface, but it wo= uld > > > > > be nice to confine the PAPR derived horridness to as small an are= a as > > > > > we can. > > > > = > > > > That horrid interface percolates all the way up the QEMU stack, > > > > unfortunately :) > > > > = > > > > Upon successfully having it's device tree node received, a DRC tran= sitions > > > > to a 'configured' state that's defined in the DR state machine (PAP= R+ 13.4). > > > > = > > > > We need to track that state, since it's used to differentiate betwe= en > > > > a case where a device is set to 'isolated' as part of entity-sense/= device > > > > configuration, as opposed to 'isolated' as part the unplug path. The > > > > overlap between the 2 can occur if we do device_add followed by an = immediate > > > > device_del, but since the 'configured' transition must occur before= the latter, > > > > it becomes unambiguous. > > > > = > > > > It's also possible that a guest might be reset in the middle of a s= eries of > > > > calls to configure-connector, in which case that state needs to be = reset. This > > > > is currently handled by sPAPRDRConnector's reset hook, so if we mov= ed that > > > > aspect out I think we'd need to wire up a reset hook for the config= ure-connector > > > > state, which is kinda messy. We'd also need a list of some sort, ke= yed by > > > > the DRC indexes, to handle the subsequent call-per-iteration's (no = guarantee > > > > only one device configuration is 'in-flight' at a time), so we end = up > > > > duplicating a lot of tracking/functionality. > > > = > > > Hmm. You should still be able to handle that with just 2 hooks and 1 > > > bit of state right? Say "start_configuration" and "end_configuration" > > > or similar. start_configuration gets the blob from the backend, then > > > end_configuration is called once RTAS has finished streaming it out to > > > the guest and updates to the cnofigured state. > > = > > {start,end}_configuration callbacks would work for handling > > the normal 'configured' state transitions induced by the call, but we'd= also > > need hooks in the "other direction" for a couple cases: > > = > > This scenario for instance: > > = > > qemu: guest: > > add device0 to drc0 > > drmgr0: rtas-configure-connector dr= c0 > > drc0->start_configuration... > > drmgr0: rtas-configure-connector dr= c0 > > drmgr0: rtas-configure-connector dr= c0 > > ... > > drmgr0: rtas-configure-connector dr= c0 > > del device0 > > drmgr0: rtas-configure-connector dr= c0 > > system_reset > > device0 removed by drc0 > > reset hook > > add device1 to drc0 drmgr0: rtas-configure-connector dr= c0 > > > > = > > So I think we'd need at least a reset hook wired up to the RTAS state. > > = > > It's also possible for the guest to force a transition out of the > > configured state by ISOLATE'ing the device. This can happen in the > > middle of the guests configure-connector calls if there's an error. If > > rtas-configure-connector is the one generating the error, it can antici= pate > > this and automatically reset the state, but in some cases the error is > > guest internal: the get_node() in src/drmgr/rtas_calls.c can fail for > > memory allocation errors, or unexpected workarea structure, after which > > point it simply stops calling rtas-configure-connector and ISOLATEs the > > device. If we don't track that, a subsequent unplug/plug could also > > result in stale FDT fragments being sent to the guest. > > = > > So we'd the RTAS state tracking code to provide an interface of some > > sort for the DRC code to call into, which results in a lot of > > duplicated state-tracking. > > = > > It's a bit unintuitive, but those FDT bits are closely coupled to the D= RC > > state, so in the end I think that ends up being the most straight-forwa= rd > > place to manage them. > = > Hrm. I'm still not following. I mean, I see that the back-end needs > to be aware of the three-valued state: CC-not-called / > CC-calls-in-progress / CC-calls-completed, but I'm not seeing why it > needs to be aware of the individual CC calls. It's not so much that the backend needs to be aware of the individual CC calls, but that the front-end/RTAS needs to be aware of the transitions made by the back-end (as with the example scenarios above), which can affect the output of those individual CC calls at any point in time. But maybe I'm misunderstanding your original suggestion. Is this more to do with the awkward drc->connector_connector interface, rather than the fact that sPAPRDRConnector manages the FDT/offsets. Because if so... > = > Could we have instead a set_state() callback of some sort, that > handles both some of the existing architected states like ISOLATED, > and also special states like CC-in-progress? I suppose we could leave the fdt/fdt_offset/configured values in the possession of sPAPRDRConnector, but provide a drc->get_cc_state(), which exposes the following to rtas_ibm_configure_connector(): typedef struct sPAPRDRCCState { /* public */ void *fdt; int fdt_offset; int fdt_depth; = /* private (or just move these up into sPAPRDRConnector) */ int fdt_start_offset; bool configured; } sPAPRDRCCState; If we do that, we can drop the FDT traversal stuff from sPAPRDRConnector, but still allow it to reset fdt/fdt_offset/configured/etc when it needs to based on it's internal state transitions. And along with that provide a drc->set_configured(void) that rtas_ibm_configure_connector() can call when it successfully completes the traversal. Is that the sort of thing you had in mind? > = > -- = > David Gibson | I'll have my music baroque, and my code > david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _othe= r_ > | _way_ _around_! > http://www.ozlabs.org/~dgibson