qemu-cr16/include/block
Kevin Wolf ee416407b3 aio-posix: Separate AioPolledEvent per AioHandler
Adaptive polling has a big problem: It doesn't consider that an event
loop can wait for many different events that may have very different
typical latencies.

For example, think of a guest that tends to send a new I/O request soon
after the previous I/O request completes, but the storage on the host is
rather slow. In this case, getting the new request from guest quickly
means that polling is enabled, but the next thing is performing the I/O
request on the backend, which is slow and disables polling again for the
next guest request. This means that in such a scenario, polling could
help for every other event, but is only ever enabled when it can't
succeed.

In order to fix this, keep a separate AioPolledEvent for each
AioHandler. We will then know that the backend file descriptor always
has a high latency and isn't worth polling for, but we also know that
the guest is always fast and we should poll for it. This solves at least
half of the problem, we can now keep polling for those cases where it
makes sense and get the improved performance from it.

Since the event loop doesn't know which event will be next, we still do
some unnecessary polling while we're waiting for the slow disk. I made
some attempts to be more clever than just randomly growing and shrinking
the polling time, and even to let callers be explicit about when they
expect a new event, but so far this hasn't resulted in improved
performance or even caused performance regressions. For now, let's just
fix the part that is easy enough to fix, we can revisit the rest later.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20250307221634.71951-6-kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2025-03-13 17:57:23 +01:00
..
accounting.h
aio-wait.h
aio.h aio-posix: Separate AioPolledEvent per AioHandler 2025-03-13 17:57:23 +01:00
aio_task.h block: Remove unused aio_task_pool_empty 2024-09-30 10:53:18 +03:00
block-common.h block: remove unused BLOCK_OP_TYPE_DATAPLANE 2025-02-06 14:51:10 +01:00
block-copy.h copy-before-write: allow specifying minimum cluster size 2024-09-30 10:52:41 +03:00
block-global-state.h block: Add blockdev-set-active QMP command 2025-02-06 14:26:51 +01:00
block-hmp-cmds.h
block-io.h
block.h
block_backup.h
block_int-common.h qemu/compiler: Absorb 'clang-tsa.h' 2025-03-06 14:21:25 +01:00
block_int-global-state.h qapi: blockdev-backup: add discard-source parameter 2024-05-28 15:52:15 +03:00
block_int-io.h
block_int.h
blockjob.h
blockjob_int.h
dirty-bitmap.h
export.h block/export: Add option to allow export of inactive nodes 2025-02-06 14:46:40 +01:00
fuse.h
graph-lock.h qemu/compiler: Absorb 'clang-tsa.h' 2025-03-06 14:21:25 +01:00
nbd.h nbd/server: Allow users to adjust handshake limit in QMP 2025-02-11 13:45:47 -06:00
nvme.h hw/nvme: set error status code explicitly for misc commands 2025-02-26 12:40:35 +01:00
qapi.h
qdict.h qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
raw-aio.h file-posix: Support FUA writes 2025-03-13 17:44:55 +01:00
replication.h
reqlist.h
snapshot.h
thread-pool.h thread-pool: Implement generic (non-AIO) pool support 2025-03-06 06:47:33 +01:00
throttle-groups.h
ufs.h hw/ufs: Add temperature event notification support 2025-03-05 02:13:29 +01:00
write-threshold.h