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


Reply via email to