This was inspired by https://bugzilla.redhat.com/show_bug.cgi?id=1481593
What happens ithere is that every virtio block device creates 2 address spaces - for modern config space (called "virtio-pci-cfg-as") and for busmaster (common pci thing, called after the device name, in my case "virtio-blk-pci"). Each address_space_init() updates topology for every address space. Every topology update (address_space_update_topology()) creates a new dispatch tree - AddressSpaceDispatch with nodes (1KB) and sections (48KB) and destroys the old one. However the dispatch destructor is postponed via RCU which does not get a chance to execute until the machine is initialized but before we get there, memory is not returned to the pool, and this is a lot of memory which grows n^2. These patches are trying to address the memory use and boot time issues but tbh only the first one provides visible outcome. There are still things to polish and double check the use of RCU, I'd like to get any feedback before proceeding - is this going the right way or way too ugly? This is based on sha1 1ab5eb4efb Peter Maydell "Update version for v2.10.0 release". Please comment. Thanks. Alexey Kardashevskiy (4): memory: Postpone flatview and dispatch tree building till all devices are added memory: Prepare for shared flat views memory: Share flat views and dispatch trees between address spaces memory: Add flat views to HMP "info mtree" include/exec/memory-internal.h | 6 +- include/exec/memory.h | 93 +++++++++---- exec.c | 242 +++++++++++++++++++-------------- hw/alpha/typhoon.c | 2 +- hw/dma/rc4030.c | 4 +- hw/i386/amd_iommu.c | 2 +- hw/i386/intel_iommu.c | 9 +- hw/intc/openpic_kvm.c | 2 +- hw/pci-host/apb.c | 2 +- hw/pci/pci.c | 3 +- hw/ppc/spapr_iommu.c | 4 +- hw/s390x/s390-pci-bus.c | 2 +- hw/vfio/common.c | 6 +- hw/virtio/vhost.c | 6 +- memory.c | 299 +++++++++++++++++++++++++++-------------- monitor.c | 3 +- vl.c | 4 + hmp-commands-info.hx | 7 +- 18 files changed, 448 insertions(+), 248 deletions(-) -- 2.11.0