The current MMIO coalescing design has a few drawbacks which limit its usefulness. Currently all coalesced MMIO zones use the same ring buffer. That means that upon a userspace exit we have to handle potentially unrelated MMIO writes synchronously. And a VM-wide lock needs to be taken in the kernel when an MMIO exit occurs. Additionally, there is no direct way for userspace to be notified about coalesced MMIO writes. If the next MMIO exit to userspace is when the ring buffer has filled then a substantial (and unbounded) amount of time may have passed since the first coalesced MMIO. This series adds new ioctls to KVM that allow for greater control by making it possible to associate different MMIO zones with different ring buffers. It also allows userspace to use poll() to check for coalesced writes in order to avoid userspace exits in vCPU threads (see patch 3 for why this can be useful). The idea of improving the API in this way originally came from Paul Durrant (pdurrant@xxxxxxxxxxxx) but the implementation is mine. The first patch in the series is a bug in the existing code that I discovered while writing a selftest and can be merged independently. Changelog: v2: - Fixed a bug in poll() in patch 3 where a NULL check was omitted. - Added an explicit include to allow the build to succeed on powerpc. - Rebased on top kvm/queue resolving a few conflicts. - Tiny changes on the last 2 patches. v1: https://lore.kernel.org/kvm/20240710085259.2125131-1-ilstam@xxxxxxxxxx/T/ Ilias Stamatis (6): KVM: Fix coalesced_mmio_has_room() KVM: Add KVM_CREATE_COALESCED_MMIO_BUFFER ioctl KVM: Support poll() on coalesced mmio buffer fds KVM: Add KVM_(UN)REGISTER_COALESCED_MMIO2 ioctls KVM: Documentation: Document v2 of coalesced MMIO API KVM: selftests: Add coalesced_mmio_test Documentation/virt/kvm/api.rst | 91 +++++ include/linux/kvm_host.h | 1 + include/uapi/linux/kvm.h | 18 + tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/coalesced_mmio_test.c | 313 ++++++++++++++++++ virt/kvm/coalesced_mmio.c | 205 +++++++++++- virt/kvm/coalesced_mmio.h | 17 +- virt/kvm/kvm_main.c | 40 ++- 8 files changed, 665 insertions(+), 21 deletions(-) create mode 100644 tools/testing/selftests/kvm/coalesced_mmio_test.c -- 2.34.1