Most existing nested aio_poll()'s in block layer are inconsiderate of dispatching potential new r/w requests from ioeventfds and nbd exports, which might result in responsiveness issues (e.g. bdrv_drain_all will not return when new requests keep coming), or even wrong semantics (e.g. qmp_transaction cannot enforce atomicity due to aio_poll in bdrv_drain_all).
Previous attampts to address this issue include new op blocker[1], bdrv_lock[2] and nested AioContext (patches not posted to qemu-devel). This approach is based on the idea proposed by Paolo Bonzini. The original idea is introducing "aio_context_disable_client / aio_context_enable_client to filter AioContext handlers according to the "client", e.g. AIO_CLIENT_DATAPLANE (ioeventfd), AIO_CLIENT_PROTOCOL, AIO_CLIENT_NBD_SERVER, AIO_CLIENT_CONTEXT, ... Extend aio_set_{event_notifier,fd}_handler to pass a client (type)." What is realized in this series is similar except the "disable, poll, enable" method, instead the bit mask of interesting client types is passed to aio_poll() (to be exact, passed to aio_poll_clients()). That is because, aio_poll may release the AioContext lock around ppoll, avoiding state will make the interface clearer. After this series, block layer aio_poll() will only process those "protocol" fds that are used in block I/O, plus the ctx->notifier for aio_notify(); other aio_poll()'s keep unchanged. The biggest advantage over approaches [1] and [2] is, no change is needed in virtio-{blk,scsi}-dataplane code, also this doesn't depend on converting QMP to coroutines. The windows implementation is not tested except for compiling. [1]: https://lists.gnu.org/archive/html/qemu-block/2015-05/msg00800.html [2]: http://lists.nongnu.org/archive/html/qemu-block/2015-06/msg00027.html Fam Zheng (11): aio: Introduce "type" in aio_set_fd_handler and aio_set_event_notifier aio: Save type to AioHandler aio-posix: Introduce aio_poll_clients aio-win32: Implement aio_poll_clients block: Mark fd handlers as "protocol" nbd: Mark fd handlers client type as "nbd server" aio: Mark ctx->notifier's client type as "context" dataplane: Mark host notifiers' client type as "dataplane" block: Introduce bdrv_aio_poll block: Replace nested aio_poll with bdrv_aio_poll block: Only poll block layer fds in bdrv_aio_poll aio-posix.c | 28 +++++++++++++++----- aio-win32.c | 42 +++++++++++++++++++++++------ async.c | 3 ++- block.c | 2 +- block/curl.c | 16 +++++++----- block/io.c | 24 ++++++++++------- block/iscsi.c | 9 +++---- block/linux-aio.c | 5 ++-- block/nbd-client.c | 10 ++++--- block/nfs.c | 19 ++++++-------- block/qed-table.c | 8 +++--- block/sheepdog.c | 32 +++++++++++++++-------- block/ssh.c | 5 ++-- block/win32-aio.c | 5 ++-- blockjob.c | 2 +- hw/block/dataplane/virtio-blk.c | 6 +++-- hw/scsi/virtio-scsi-dataplane.c | 24 +++++++++++------ include/block/aio.h | 20 +++++++++++++- include/block/block.h | 2 ++ nbd.c | 4 ++- qemu-img.c | 2 +- qemu-io-cmds.c | 4 +-- tests/test-aio.c | 58 +++++++++++++++++++++++------------------ 23 files changed, 215 insertions(+), 115 deletions(-) -- 2.4.3