We currently flush the coalesced MMIO buffer on every vmexit to userspace. KVM only provides a single buffer per VM, so a central lock is required to read from it. This is a contention point given a large enough VCPU set. Moreover, we need to hold the BQL while replaying the queued requests, probably for a long time until there is more fine grained locking available. Good reasons to overcome the unconditional flush.
The series achieves this by flushing only on selected memory region accesses, either generically via the memory access dispatcher or directly on certain VGA PIO accesses that are not yet fully converted. Another reason to flush are remappings or other relevant region state changes. Please review carefully. CC: Andreas Färber <andreas.faer...@web.de> CC: Hervé Poussineau <hpous...@reactos.org> Jan Kiszka (5): i82378: Remove bogus MMIO coalescing memory: Flush coalesced MMIO on selected region access memory: Flush coalesced MMIO on mapping and state changes VGA: Flush coalesced MMIO on related MMIO/PIO accesses kvm: Stop flushing coalesced MMIO on vmexit hw/cirrus_vga.c | 7 +++++++ hw/i82378.c | 1 - hw/qxl.c | 1 + hw/vga-isa-mm.c | 1 + hw/vga.c | 5 +++++ hw/vmware_vga.c | 1 + kvm-all.c | 2 -- memory.c | 36 ++++++++++++++++++++++++++++++++++++ memory.h | 13 +++++++++++++ 9 files changed, 64 insertions(+), 3 deletions(-) -- 1.7.3.4