On Thu, 8 Jun 2017 15:09:27 +1000 David Gibson <da...@gibson.dropbear.id.au> wrote:
> spapr_drc_detach() is called when qemu generic code requests a device be > unplugged. It makes a number of tests, which could well delay further > action until later, before actually detach the device from the DRC. > > This splits out the part which actually removes the device from the DRC > into spapr_drc_release(). This will be useful for further cleanups. > > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> > --- Reviewed-by: Greg Kurz <gr...@kaod.org> > hw/ppc/spapr_drc.c | 54 > ++++++++++++++++++++++++++++++------------------------ > 1 file changed, 30 insertions(+), 24 deletions(-) > > diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c > index afd68f4..dc4ac77 100644 > --- a/hw/ppc/spapr_drc.c > +++ b/hw/ppc/spapr_drc.c > @@ -326,31 +326,9 @@ void spapr_drc_attach(sPAPRDRConnector *drc, DeviceState > *d, void *fdt, > NULL, 0, NULL); > } > > -void spapr_drc_detach(sPAPRDRConnector *drc, DeviceState *d, Error **errp) > -{ > - trace_spapr_drc_detach(spapr_drc_index(drc)); > - > - if (drc->isolation_state != SPAPR_DR_ISOLATION_STATE_ISOLATED) { > - trace_spapr_drc_awaiting_isolated(spapr_drc_index(drc)); > - drc->awaiting_release = true; > - return; > - } > - > - if (spapr_drc_type(drc) != SPAPR_DR_CONNECTOR_TYPE_PCI && > - drc->allocation_state != SPAPR_DR_ALLOCATION_STATE_UNUSABLE) { > - trace_spapr_drc_awaiting_unusable(spapr_drc_index(drc)); > - drc->awaiting_release = true; > - return; > - } > - > - if (drc->awaiting_allocation) { > - if (!drc->awaiting_allocation_skippable) { > - drc->awaiting_release = true; > - trace_spapr_drc_awaiting_allocation(spapr_drc_index(drc)); > - return; > - } > - } > > +static void spapr_drc_release(sPAPRDRConnector *drc) > +{ > drc->dr_indicator = SPAPR_DR_INDICATOR_INACTIVE; > > /* Calling release callbacks based on spapr_drc_type(drc). */ > @@ -379,6 +357,34 @@ void spapr_drc_detach(sPAPRDRConnector *drc, DeviceState > *d, Error **errp) > drc->dev = NULL; > } > > +void spapr_drc_detach(sPAPRDRConnector *drc, DeviceState *d, Error **errp) > +{ > + trace_spapr_drc_detach(spapr_drc_index(drc)); > + > + if (drc->isolation_state != SPAPR_DR_ISOLATION_STATE_ISOLATED) { > + trace_spapr_drc_awaiting_isolated(spapr_drc_index(drc)); > + drc->awaiting_release = true; > + return; > + } > + > + if (spapr_drc_type(drc) != SPAPR_DR_CONNECTOR_TYPE_PCI && > + drc->allocation_state != SPAPR_DR_ALLOCATION_STATE_UNUSABLE) { > + trace_spapr_drc_awaiting_unusable(spapr_drc_index(drc)); > + drc->awaiting_release = true; > + return; > + } > + > + if (drc->awaiting_allocation) { > + if (!drc->awaiting_allocation_skippable) { > + drc->awaiting_release = true; > + trace_spapr_drc_awaiting_allocation(spapr_drc_index(drc)); > + return; > + } > + } > + > + spapr_drc_release(drc); > +} > + > static bool release_pending(sPAPRDRConnector *drc) > { > return drc->awaiting_release;
pgpOhG9FGY8oQ.pgp
Description: OpenPGP digital signature