[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 05/15] spapr_pci: add PHB unrealize
From: |
Michael Roth |
Subject: |
[Qemu-devel] [RFC PATCH 05/15] spapr_pci: add PHB unrealize |
Date: |
Wed, 29 Apr 2015 14:20:14 -0500 |
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
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.
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;
+
+ /* 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);
+ object_unparent(OBJECT(&sphb->iowindow));
+ object_unparent(OBJECT(&sphb->iospace));
+
+ memory_region_del_subregion(get_system_memory(), &sphb->memwindow);
+ 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);
+
+ 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;
--
1.9.1
- [Qemu-devel] [RFC PATCH 14/15] spapr_pci: add ibm, my-drc-index property for PHB hotplug, (continued)
- [Qemu-devel] [RFC PATCH 14/15] spapr_pci: add ibm, my-drc-index property for PHB hotplug, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 01/15] pci: allow cleanup/unregistration of PCI buses, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 02/15] qdev: store DeviceState's canonical path to use when unparenting, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 04/15] spapr_iommu: pass object ownership to parent/owner, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 15/15] spapr: add hotplug hooks for PHB hotplug, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 03/15] spapr_drc: pass object ownership to parent/owner, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 05/15] spapr_pci: add PHB unrealize,
Michael Roth <=
- [Qemu-devel] [RFC PATCH 07/15] spapr: enable PHB hotplug for pseries-2.4, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 06/15] spapr_pci: also use 'index' property as DRC index for PHBs, Michael Roth, 2015/04/29
- [Qemu-devel] [RFC PATCH 08/15] spapr: create DR connectors for PHBs and register reset hooks, Michael Roth, 2015/04/29
- Re: [Qemu-devel] [RFC PATCH 00/15] spapr: add support for PHB hotplug, Paolo Bonzini, 2015/04/30