[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [RFC PATCH 05/15] spapr_pci: add PHB unrealize
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-ppc] [RFC PATCH 05/15] spapr_pci: add PHB unrealize |
Date: |
Thu, 30 Apr 2015 16:05:17 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 |
On 29/04/2015 21:20, Michael Roth wrote:
> To support PHB hotplug we need to clean up lingering references,
> memory, child properties, etc. prior to the PHB object being
> finalized. Generally this will be called as a result of calling
> object_unref() on the PHB object, which in turn would normally
s/object_unref/object_unparent/
> be called as the result of an unplug() operation.
>
> When the PHB is finalized, child objects will be unparented in
> turn, and finalized if the PHB was the only reference holder. so
> we don't bother to explicitly unparent child objects of the PHB
> (spapr_iommu, spapr_drc, etc).
>
> We do need to handle memory regions explicitly however, since
> they also take a reference on the PHB, and won't allow it to
> be finalized otherwise.
They shouldn't hold a reference anymore as soon as the regions are not
visible in an AddressSpace (and the RCU thread has picked up the changes).
In fact, docs/memory.txt documents (!) that you must call
object_unparent() for memory regions in the instance_finalize function,
not in the unrealize function.
> Signed-off-by: Michael Roth <address@hidden>
> ---
> hw/ppc/spapr_pci.c | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
> index 2e7590c..25a738c 100644
> --- a/hw/ppc/spapr_pci.c
> +++ b/hw/ppc/spapr_pci.c
> @@ -1108,6 +1108,37 @@ static void spapr_phb_hot_unplug_child(HotplugHandler
> *plug_handler,
> }
> }
>
> +static void spapr_phb_unrealize(DeviceState *dev, Error **errp)
> +{
> + SysBusDevice *s = SYS_BUS_DEVICE(dev);
> + PCIHostState *phb = PCI_HOST_BRIDGE(s);
> + sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(phb);
> + sPAPRTCETable *tcet;
> +
> + pci_unregister_bus(phb->bus);
> +
> + g_free(sphb->dtbusname);
> + sphb->dtbusname = NULL;
This g_free can probably also be moved for simplicity to instance_finalize.
> + /* remove IO/MMIO subregions and aliases, rest should get cleaned
> + * via PHB's unrealize->object_finalize
> + */
> + memory_region_del_subregion(get_system_memory(), &sphb->iowindow);
^^ You should indeed do this here.
> + object_unparent(OBJECT(&sphb->iowindow));
> + object_unparent(OBJECT(&sphb->iospace));
> +
> + memory_region_del_subregion(get_system_memory(), &sphb->memwindow);
^^ and this
> + object_unparent(OBJECT(&sphb->memwindow));
> + object_unparent(OBJECT(&sphb->memspace));
> +
> + tcet = spapr_tce_find_by_liobn(sphb->dma_liobn);
> + memory_region_del_subregion(&sphb->iommu_root, &sphb->msiwindow);
> + memory_region_del_subregion(&sphb->iommu_root,
> spapr_tce_get_iommu(tcet));
> + address_space_destroy(&sphb->iommu_as);
^^ and these three. However, the object_unparents should be in
instance_finalize.
Paolo
> + QLIST_REMOVE(sphb, list);
> +}
> +
> static void spapr_phb_realize(DeviceState *dev, Error **errp)
> {
> SysBusDevice *s = SYS_BUS_DEVICE(dev);
> @@ -1442,6 +1473,7 @@ static void spapr_phb_class_init(ObjectClass *klass,
> void *data)
>
> hc->root_bus_path = spapr_phb_root_bus_path;
> dc->realize = spapr_phb_realize;
> + dc->unrealize = spapr_phb_unrealize;
> dc->props = spapr_phb_properties;
> dc->reset = spapr_phb_reset;
> dc->vmsd = &vmstate_spapr_pci;
>
- Re: [Qemu-ppc] [RFC PATCH 11/15] qdev: add qbus_set_hotplug_handler_generic(), (continued)
- [Qemu-ppc] [RFC PATCH 14/15] spapr_pci: add ibm, my-drc-index property for PHB hotplug, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 12/15] spapr: stub implementation of machine-level HotplugHandler interface, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 13/15] spapr_pci: provide node start offset via spapr_populate_pci_dt(), Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 01/15] pci: allow cleanup/unregistration of PCI buses, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 15/15] spapr: add hotplug hooks for PHB hotplug, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 02/15] qdev: store DeviceState's canonical path to use when unparenting, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 05/15] spapr_pci: add PHB unrealize, Michael Roth, 2015/04/29
- Re: [Qemu-ppc] [RFC PATCH 05/15] spapr_pci: add PHB unrealize,
Paolo Bonzini <=
- [Qemu-ppc] [RFC PATCH 03/15] spapr_drc: pass object ownership to parent/owner, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 04/15] spapr_iommu: pass object ownership to parent/owner, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 06/15] spapr_pci: also use 'index' property as DRC index for PHBs, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 07/15] spapr: enable PHB hotplug for pseries-2.4, Michael Roth, 2015/04/29
- [Qemu-ppc] [RFC PATCH 08/15] spapr: create DR connectors for PHBs and register reset hooks, Michael Roth, 2015/04/29