Give the per-devfn S390 PCI IOMMU object a canonical path under the S390 PCI host state. s390_pci_iommu_free() already calls object_unparent(), which was previously a no-op; it now performs the actual release.
For the multi-process remote IOMMU, replace the raw object_new(TYPE_MEMORY_REGION) with a proper memory_region_init() under the RemoteIommu object so the MR gets an owner like every other MR in the tree. AI-used-for: code (refactoring) Signed-off-by: Alexander Graf <[email protected]> --- hw/remote/iommu.c | 7 ++++--- hw/s390x/s390-pci-bus.c | 9 +++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/hw/remote/iommu.c b/hw/remote/iommu.c index 3e0758a21e..52ee9765e6 100644 --- a/hw/remote/iommu.c +++ b/hw/remote/iommu.c @@ -52,8 +52,9 @@ static AddressSpace *remote_iommu_find_add_as(PCIBus *pci_bus, } if (!elem->mr) { - elem->mr = MEMORY_REGION(object_new(TYPE_MEMORY_REGION)); - memory_region_set_size(elem->mr, UINT64_MAX); + g_autofree char *name = g_strdup_printf("mr-devfn-%02x", devfn); + elem->mr = g_new0(MemoryRegion, 1); + memory_region_init(elem->mr, OBJECT(iommu), name, UINT64_MAX); address_space_init(&elem->as, elem->mr, NULL); } @@ -75,7 +76,7 @@ void remote_iommu_unplug_dev(PCIDevice *pci_dev) address_space_destroy(&elem->as); - object_unref(elem->mr); + object_unparent(OBJECT(elem->mr)); elem->mr = NULL; } diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index 4f0a8a787b..da8406cc4e 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -618,7 +618,13 @@ static S390PCIIOMMU *s390_pci_get_iommu(S390pciState *s, PCIBus *bus, iommu = table->iommu[PCI_SLOT(devfn)]; if (!iommu) { - iommu = S390_PCI_IOMMU(object_new(TYPE_S390_PCI_IOMMU)); + char *ch_name = g_strdup_printf("iommu[%02x:%02x.%01x]", + pci_bus_num(bus), + PCI_SLOT(devfn), + PCI_FUNC(devfn)); + iommu = S390_PCI_IOMMU(object_new_child(OBJECT(s), ch_name, + TYPE_S390_PCI_IOMMU)); + g_free(ch_name); char *mr_name = g_strdup_printf("iommu-root-%02x:%02x.%01x", pci_bus_num(bus), @@ -798,7 +804,6 @@ static void s390_pci_iommu_free(S390pciState *s, PCIBus *bus, int32_t devfn) address_space_destroy(&iommu->as); object_unparent(OBJECT(&iommu->mr)); object_unparent(OBJECT(iommu)); - object_unref(OBJECT(iommu)); } S390PCIGroup *s390_group_create(int id, int host_id) -- 2.47.1
