ARM virt uses GPEX PCIe bridge. This latter does not implement INTx to GSI routing. PCIe/INTx assignment works but the consequence is irqfd is not used with INTx interrupts and VFIO handlers are executed on userspace leading to an important performance degradation.
This is witnessed by the following message;
qemu-system-aarch64: -device vfio-pci,host=0006:90:00.0: PCI: Bug - unimplemented PCI INTx routing (gpex-pcihost)
qemu-system-aarch64: PCI: Bug - unimplemented PCI INTx routing (gpex-pcihost)
qemu-system-aarch64: PCI: Bug - unimplemented PCI INTx routing (gpex-pcihost)
2 patches were submitted a while ago on the ML but have never been upstreamed (https://patchwork.kernel.org/patch/8165031/).
- Generic PCIe host bridge INTx determination for INTx routing
- Add a function to determine interrupt number for INTx routing
This is time to respin & complete the work.
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.
For information on the advisory, and where to find the updated
files, follow the link below.
If the solution does not work for you, open a new bug report.
https://access.redhat.com/errata/RHBA-2018:0831