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