On 11/03/19 14:48, Sergio Lopez wrote: >> The initialization is O(n^2) because the guest initializes one device at >> a time, so you rebuild the FlatView first with 0 devices, then 1, then >> 2, etc. This is very hard to fix, if at all possible. >> >> However, each FlatView creation should be O(n) where n is the number of >> devices currently configured. Please check with "info mtree -f" that >> you only have a fixed number of FlatViews. Old versions had one per device. > I'm seeing 9 FVs with 1 PCI, and 119 with 100 PCIs.
With $ eval qemu-system-x86_64 -M q35 \ -device\ e1000,id=n{1,2,3,4,5,6,7,8}{1,2,3} I only see 4 flat views ("system", "io", "memory", "(none)"). Probably you are using intel-iommu? Peter, it should be possible to reorganize the VT-d memory regions like this: intel_iommu_ir (MMIO, not added to any container) vtd_root_dmar (container) intel_iommu_dmar (IOMMU), priority 0 alias to intel_iommu_ir, priority 1 vtd_root_nodmar alias to get_system_memory(), priority 0 alias to intel_iommu_ir, priority 1 vtd_root_0 memory region (container) vtd_root_dmar # only one of these is enabled vtd_root_nodmar where the vtd_root_dmar and vtd_root_nodmar memory regions are created in vtd_init once and for all. Because all vtd_root_* memory regions have only one child, memory.c will recognize that they represent the same memory, and create at most two FlatViews (one for vtd_root_dmar, one for vtd_root_nodmar). Paolo