summaryrefslogtreecommitdiffstats
path: root/hw/pci-bridge/pci_bridge_dev.c
diff options
context:
space:
mode:
authorPaolo Bonzini2015-02-12 21:39:20 +0100
committerPaolo Bonzini2015-02-16 17:30:14 +0100
commit5cd5e7015962d8d559afb5154888fd34a8526ddd (patch)
tree071ec5fb47bd2a5a902bc0f4bcd320dd1354e5bd /hw/pci-bridge/pci_bridge_dev.c
parentpcie: remove mmconfig memory leak and wrap mmconfig update with transaction (diff)
downloadqemu-5cd5e7015962d8d559afb5154888fd34a8526ddd.tar.gz
qemu-5cd5e7015962d8d559afb5154888fd34a8526ddd.tar.xz
qemu-5cd5e7015962d8d559afb5154888fd34a8526ddd.zip
pci: split shpc_cleanup and shpc_free
object_unparent should not be called until the parent device is going to be destroyed. Only remove the capability and do memory_region_del_subregion at unrealize time. Freeing the data structures is left in shpc_free, to be called from the instance_finalize callback. Acked-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw/pci-bridge/pci_bridge_dev.c')
-rw-r--r--hw/pci-bridge/pci_bridge_dev.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
index 252ea5eb53..36f73e1f8b 100644
--- a/hw/pci-bridge/pci_bridge_dev.c
+++ b/hw/pci-bridge/pci_bridge_dev.c
@@ -97,6 +97,11 @@ static void pci_bridge_dev_exitfn(PCIDevice *dev)
pci_bridge_exitfn(dev);
}
+static void pci_bridge_dev_instance_finalize(Object *obj)
+{
+ shpc_free(PCI_DEVICE(obj));
+}
+
static void pci_bridge_dev_write_config(PCIDevice *d,
uint32_t address, uint32_t val, int len)
{
@@ -154,10 +159,11 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
}
static const TypeInfo pci_bridge_dev_info = {
- .name = TYPE_PCI_BRIDGE_DEV,
- .parent = TYPE_PCI_BRIDGE,
- .instance_size = sizeof(PCIBridgeDev),
- .class_init = pci_bridge_dev_class_init,
+ .name = TYPE_PCI_BRIDGE_DEV,
+ .parent = TYPE_PCI_BRIDGE,
+ .instance_size = sizeof(PCIBridgeDev),
+ .class_init = pci_bridge_dev_class_init,
+ .instance_finalize = pci_bridge_dev_instance_finalize,
.interfaces = (InterfaceInfo[]) {
{ TYPE_HOTPLUG_HANDLER },
{ }