Supersedes: https://lore.kernel.org/qemu-devel/[email protected]/ ("[PATCH v9 0/2] Fix check-qtest-ppc64 sanitizer errors")
MemoryRegions used to "piggyback" on their owners instead of using their reference counters due to the circular dependencies between them, which caused memory leak. I tried to fix it with "[PATCH v9 0/2] Fix check-qtest-ppc64 sanitizer errors" but it resulted in a lengthy discussion; ultimately it is attributed to the fact that "piggybacking" is hard to understand and forces us design trade-offs. It was also insufficient because it only deals with the container-subregion pattern and did not deal with DMA. With this series, I remove the "piggyback" hack altogather. The key insight here is that the owners explicitly call memory_region_del_subregion() to stop accepting new accesses to its MemoryRegions when they are no longer needed. I code the fact by calling object_unparent() along with it. While I could write a function like memory_region_unparent() and replace such memory_region_del_subregion() calls, I used a few other insights to simplify the code: - Deletable MemoryRegions are of hotpluggable devices. - Devices do no longer accept new accesses after unrealization. So I made the common qdev code call memory_region_del_subregion() and object_unparent(). In the end, this series makes the code simpler and semantically robust, and kills the entire class of memory leak. Patch [1, 2] removes object_unparent() calls in instance_finalize(), which are incorrect. Patch 3 makes the qdev code automatically call memory_region_del_subregion(). Patch [4, 15] removes memory_region_del_subregion() calls that are obviously no longer needed, demonstrating the benefit of automatic automatic subregion deletion. Patch 16 adds the object_unparent() call and stop piggybacking. Signed-off-by: Akihiko Odaki <[email protected]> --- Akihiko Odaki (16): docs/devel: Do not unparent in instance_finalize vfio/pci: Do not unparent in instance_finalize qdev: Automatically delete memory subregions hw/char/diva-gsp: Do not delete the subregion hw/char/serial-pci-multi: Do not delete the subregion secondary-vga: Do not delete the subregions cmd646: Do not delete the subregions hw/ide/piix: Do not delete the subregions hw/ide/via: Do not delete the subregions hw/nvme: Do not delete the subregion pci: Do not delete the subregions hw/ppc/spapr_pci: Do not delete the subregions hw/usb/hcd-ehci: Do not delete the subregions hw/usb/hcd-xhci: Do not delete the subregions vfio-user: Do not delete the subregion memory: Stop piggybacking on memory region owners MAINTAINERS | 1 + docs/devel/memory.rst | 45 +++++++++++++++++----------------------- include/hw/qdev-core.h | 2 ++ include/system/memory.h | 51 +++++++++++++++++++++++----------------------- hw/char/diva-gsp.c | 1 - hw/char/serial-pci-multi.c | 1 - hw/core/qdev.c | 29 ++++++++++++++++++++++++++ hw/display/vga-pci.c | 8 -------- hw/ide/cmd646.c | 12 ----------- hw/ide/piix.c | 13 ------------ hw/ide/via.c | 12 ----------- hw/nvme/ctrl.c | 2 -- hw/pci/pci.c | 20 ------------------ hw/ppc/spapr_pci.c | 22 -------------------- hw/usb/hcd-ehci.c | 4 ---- hw/usb/hcd-xhci.c | 10 --------- hw/vfio-user/pci.c | 6 ------ hw/vfio/pci.c | 4 ---- stubs/memory.c | 9 ++++++++ system/memory.c | 11 +++------- stubs/meson.build | 1 + 21 files changed, 89 insertions(+), 175 deletions(-) --- base-commit: e101d33792530093fa0b0a6e5f43e4d8cfe4581e change-id: 20250831-mr-d0dc495bad11 Best regards, -- Akihiko Odaki <[email protected]>
