v2: * Uninitialized node->deleted gone [Fam] * Removed 1024 polling loop iteration qemu_clock_get_ns() optimization which created a weird step pattern [Fam] * Unified with AioHandler, dropped AioPollHandler struct [Paolo] (actually I think Paolo had more in mind but this is the first step) * Only poll when all event loop resources support it [Paolo] * Added run_poll_handlers_begin/end trace events for perf analysis * Sorry, Christian, no virtqueue kick suppression yet
Recent performance investigation work done by Karl Rister shows that the guest->host notification takes around 20 us. This is more than the "overhead" of QEMU itself (e.g. block layer). One way to avoid the costly exit is to use polling instead of notification. The main drawback of polling is that it consumes CPU resources. In order to benefit performance the host must have extra CPU cycles available on physical CPUs that aren't used by the guest. This is an experimental AioContext polling implementation. It adds a polling callback into the event loop. Polling functions are implemented for virtio-blk virtqueue guest->host kick and Linux AIO completion. The QEMU_AIO_POLL_MAX_NS environment variable sets the number of nanoseconds to poll before entering the usual blocking poll(2) syscall. Try setting this variable to the time from old request completion to new virtqueue kick. By default no polling is done. The QEMU_AIO_POLL_MAX_NS must be set to get any polling! Stefan Hajnoczi (4): aio: add AioPollFn and io_poll() interface aio: add polling mode to AioContext virtio: poll virtqueues for new buffers linux-aio: poll ring for completions aio-posix.c | 115 ++++++++++++++++++++++++++++++++++++++++++-- async.c | 14 +++++- block/curl.c | 8 +-- block/iscsi.c | 3 +- block/linux-aio.c | 19 +++++++- block/nbd-client.c | 8 +-- block/nfs.c | 7 +-- block/sheepdog.c | 26 +++++----- block/ssh.c | 4 +- block/win32-aio.c | 4 +- hw/virtio/virtio.c | 18 ++++++- include/block/aio.h | 8 ++- iohandler.c | 2 +- nbd/server.c | 9 ++-- stubs/set-fd-handler.c | 1 + tests/test-aio.c | 4 +- trace-events | 4 ++ util/event_notifier-posix.c | 2 +- 18 files changed, 207 insertions(+), 49 deletions(-) -- 2.7.4