qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: David Gibson <david@gibson.dropbear.id.au>
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
Subject: Re: [Qemu-devel] [PATCH v5 07/16] spapr_rtas: add ibm, configure-connector RTAS interface
Date: Thu, 26 Feb 2015 16:21:55 -0600	[thread overview]
Message-ID: <20150226222155.31752.51742@loki> (raw)
In-Reply-To: <20150225004823.GA15695@voom.fritz.box>

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:
> > > > This interface is used to fetch an OF device-tree nodes that describes a
> > > > newly-attached device to guest. It is called multiple times to walk the
> > > > device-tree node and fetch individual properties into a 'workarea'/buffer
> > > > provided by the guest.
> > > > 
> > > > The device-tree is generated by QEMU and passed to an sPAPRDRConnector during
> > > > the initial hotplug operation, and the state of these RTAS calls is tracked by
> > > > the sPAPRDRConnector. When the last of these properties is successfully
> > > > fetched, we report as special return value to the guest and transition
> > > > the device to a 'configured' state on the QEMU/DRC side.
> > > > 
> > > > See docs/specs/ppc-spapr-hotplug.txt for a complete description of
> > > > this interface.
> > > > 
> > > > Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> > > > ---
> > > >  hw/ppc/spapr_rtas.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 81 insertions(+)
> > > > 
> > > > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
> > > > index f80beb2..b8551b0 100644
> > > > --- a/hw/ppc/spapr_rtas.c
> > > > +++ b/hw/ppc/spapr_rtas.c
> > > > @@ -418,6 +418,85 @@ static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPREnvironment *spapr,
> > > >      rtas_st(rets, 1, entity_sense);
> > > >  }
> > > >  
> > > > +/* configure-connector work area offsets, int32_t units for field
> > > > + * indexes, bytes for field offset/len values.
> > > > + *
> > > > + * as documented by PAPR+ v2.7, 13.5.3.5
> > > > + */
> > > > +#define CC_IDX_NODE_NAME_OFFSET 2
> > > > +#define CC_IDX_PROP_NAME_OFFSET 2
> > > > +#define CC_IDX_PROP_LEN 3
> > > > +#define CC_IDX_PROP_DATA_OFFSET 4
> > > > +#define CC_VAL_DATA_OFFSET ((CC_IDX_PROP_DATA_OFFSET + 1) * 4)
> > > > +#define CC_WA_LEN 4096
> > > > +
> > > > +static void rtas_ibm_configure_connector(PowerPCCPU *cpu,
> > > > +                                         sPAPREnvironment *spapr,
> > > > +                                         uint32_t token, uint32_t nargs,
> > > > +                                         target_ulong args, uint32_t nret,
> > > > +                                         target_ulong rets)
> > > > +{
> > > > +    uint64_t wa_addr = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 0);
> > > 
> > > You need to check nargs and nret first.
> > 
> > Could've sworn I'd fixed all those cases. Will make sure to take care of it on
> > the next one.
> > 
> > > 
> > > > +    uint64_t wa_offset;
> > > > +    uint32_t drc_index;
> > > > +    sPAPRDRConnector *drc;
> > > > +    sPAPRDRConnectorClass *drck;
> > > > +    sPAPRDRCCResponse resp;
> > > > +    const struct fdt_property *prop = NULL;
> > > > +    char *prop_name = NULL;
> > > > +    int prop_len, rc;
> > > > +
> > > > +    drc_index = rtas_ld(wa_addr, 0);
> > > > +    drc = spapr_dr_connector_by_index(drc_index);
> > > > +    if (!drc) {
> > > > +        DPRINTF("rtas_ibm_configure_connector: invalid sensor/DRC index: %xh\n",
> > > > +                drc_index);
> > > > +        rc = RTAS_OUT_PARAM_ERROR;
> > > > +        goto out;
> > > > +    }
> > > > +    drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> > > > +    resp = 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 callback?
> > > 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 would
> > > be nice to confine the PAPR derived horridness to as small an area 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 transitions
> > to a 'configured' state that's defined in the DR state machine (PAPR+ 13.4).
> > 
> > We need to track that state, since it's used to differentiate between
> > 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 series 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 moved that
> > aspect out I think we'd need to wire up a reset hook for the configure-connector
> > state, which is kinda messy. We'd also need a list of some sort, keyed 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 drc0
      drc0->start_configuration...
                                    drmgr0: rtas-configure-connector drc0
                                    drmgr0: rtas-configure-connector drc0
                                    ...
                                    drmgr0: rtas-configure-connector drc0
      del device0                   <device0 removal pending>
                                    drmgr0: rtas-configure-connector drc0
      system_reset
      device0 removed by drc0
        reset hook
      add device1 to drc0           drmgr0: rtas-configure-connector drc0
                                    <begins fetching stale FDT>

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 anticipate
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 DRC
state, so in the end I think that ends up being the most straight-forward
place to manage them.

> 
> -- 
> David Gibson                    | I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
>                                 | _way_ _around_!
> http://www.ozlabs.org/~dgibson

  reply	other threads:[~2015-02-26 22:23 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-16 14:27 [Qemu-devel] [PATCH resend v5 00/16] spapr: add support for pci hotplug Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 01/16] docs: add sPAPR hotplug/dynamic-reconfiguration documentation Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 02/16] spapr_drc: initial implementation of sPAPRDRConnector device Michael Roth
2015-02-23  6:05   ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 03/16] spapr_rtas: add get/set-power-level RTAS interfaces Michael Roth
2015-02-24  6:29   ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 04/16] spapr_rtas: add set-indicator RTAS interface Michael Roth
2015-02-24  6:32   ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 05/16] spapr_rtas: add get-sensor-state " Michael Roth
2015-02-24  6:33   ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 06/16] spapr: add rtas_st_buffer_direct() helper Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 07/16] spapr_rtas: add ibm, configure-connector RTAS interface Michael Roth
2015-02-24  6:40   ` David Gibson
2015-02-24 20:43     ` Michael Roth
2015-02-25  0:48       ` David Gibson
2015-02-26 22:21         ` Michael Roth [this message]
2015-02-27  5:31           ` David Gibson
2015-02-27 17:37             ` Michael Roth
2015-03-02  6:25               ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 08/16] spapr_events: re-use EPOW event infrastructure for hotplug events Michael Roth
2015-02-24  6:49   ` David Gibson
2015-02-24 20:04     ` Michael Roth
2015-02-25  0:54       ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 09/16] spapr_events: event-scan RTAS interface Michael Roth
2015-02-24  9:11   ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 10/16] spapr_drc: add spapr_drc_populate_dt() Michael Roth
2015-02-24  9:26   ` David Gibson
2015-02-24 19:21     ` Michael Roth
2015-02-26 15:56   ` Nathan Fontenot
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 11/16] spapr_pci: add dynamic-reconfiguration option for spapr-pci-host-bridge Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 12/16] spapr_pci: create DRConnectors for each PCI slot during PHB realize Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 13/16] spapr_pci: populate DRC dt entries for PHBs Michael Roth
2015-02-24  9:29   ` David Gibson
2015-02-24 18:52     ` Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 14/16] pci: make pci_bar useable outside pci.c Michael Roth
2015-02-24 10:20   ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 15/16] spapr_pci: enable basic hotplug operations Michael Roth
2015-02-25  3:11   ` David Gibson
2015-02-25  5:17     ` Michael Roth
2015-02-25  6:40       ` Michael Roth
2015-02-26 20:06         ` Michael Roth
2015-02-27  5:14           ` David Gibson
2015-02-26  3:49       ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 16/16] spapr_pci: emit hotplug add/remove events during hotplug Michael Roth
2015-02-25  3:18   ` David Gibson
  -- strict thread matches above, loose matches on Subject: below --
2015-02-16 14:10 [Qemu-devel] [PATCH v5 00/16] spapr: add support for pci hotplug Michael Roth
2015-02-16 14:10 ` [Qemu-devel] [PATCH v5 07/16] spapr_rtas: add ibm, configure-connector RTAS interface Michael Roth

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150226222155.31752.51742@loki \
    --to=mdroth@linux.vnet.ibm.com \
    --cc=agraf@suse.de \
    --cc=aik@ozlabs.ru \
    --cc=bharata.rao@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=ncmike@ncultra.org \
    --cc=nfont@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=tyreld@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).