v2: * Rebased onto qemu.git/master * Added comment explaining how the dataplane thread is restarted after draining [pbonzini]
This series adds image format, QMP 'transation', and QMP 'block_resize' support to dataplane. This is done by replacing custom Linux AIO code with QEMU block layer APIs. In order for block layer APIs to be safe, bdrv_drain_all() is modified to be aware of device emulation threads (like dataplane). BlockDevOps->drain_threads_cb() is introduced as a way to stop device emulation threads temporarily. Device emulation threads may resume after this main loop iteration completes, which is enough to allow code running under the QEMU global mutex a chance to use the block device temporarily. bdrv_get_aio_context() is dropped in favor of a thread-local AioContext pointer. This allows qemu_bh_new(), qemu_aio_wait(), and friends to automatically use the right AioContext. When we introduce a BlockDriverState lock in the future, it will be possible to use block devices from multiple threads arbitrarily (right now we only allow it if bdrv_drain_all() is used). Three open issues: * Timers only work in the main loop, so I/O throttling is ignored and QED is unsafe with x-data-plane=on. I am tackling this in a separate series that makes QEMUTimer thread-safe and can then re-enable I/O throttling. * Peformance analysis in progress. * Need to test with NBD, Gluster, and other non-file protocols. Paolo Bonzini (2): exec: do not use qemu/tls.h qemu-thread: add TLS wrappers Stefan Hajnoczi (11): dataplane: sync virtio.c and vring.c virtqueue state block: add BlockDevOps->drain_threads_cb() virtio-blk: implement BlockDevOps->drain_threads_cb() block: add thread_aio_context TLS variable block: drop bdrv_get_aio_context() main-loop: use thread-local AioContext linux-aio: bind EventNotifier to current AioContext block: disable I/O throttling outside main loop dataplane: use block layer for I/O dataplane: drop ioq Linux AIO request queue block: drop raw_get_aio_fd() async.c | 2 + block.c | 17 ++- block/linux-aio.c | 19 ++- block/raw-posix.c | 38 +---- block/raw-win32.c | 2 +- configure | 21 +++ cpus.c | 2 + exec.c | 10 +- hw/block/dataplane/Makefile.objs | 2 +- hw/block/dataplane/ioq.c | 117 --------------- hw/block/dataplane/ioq.h | 57 ------- hw/block/dataplane/virtio-blk.c | 290 ++++++++++++------------------------ hw/block/virtio-blk.c | 16 ++ hw/virtio/dataplane/vring.c | 8 +- include/block/aio.h | 4 + include/block/block.h | 17 ++- include/block/block_int.h | 7 - include/hw/virtio/dataplane/vring.h | 2 +- include/qemu/tls.h | 125 +++++++++++++--- include/qom/cpu.h | 14 +- main-loop.c | 16 +- tests/Makefile | 3 + tests/test-tls.c | 87 +++++++++++ util/qemu-thread-win32.c | 17 +++ 24 files changed, 426 insertions(+), 467 deletions(-) delete mode 100644 hw/block/dataplane/ioq.c delete mode 100644 hw/block/dataplane/ioq.h create mode 100644 tests/test-tls.c -- 1.8.1.4