On Tue, Oct 21, 2014 at 12:03:49PM +0100, Stefan Hajnoczi wrote: > v2: > * Protect block_job_defer_to_main_loop_bh() against AioContext change [Max] > * Drop unnecessary if (buf) around qemu_vfree(buf) [Max] > > Almost all the infrastructure is in place to make blockjobs safe for use with > dataplane: > > * Op blockers all us to exclude commands that could conflict with a blockjob > or dataplane. > > * AioContext acquire/release allows threads to temporarily access a > BlockDriverState that is running in another thread. > > This series introduces a few additional helpers: > > * block_job_defer_to_main_loop() which allows blockjobs to run their > completion code in the QEMU main loop. This is necessary because some > operations are not safe outside the QEMU global mutex. > > * bdrv_drain() which can be used in limited cases to wait for in-flight > requests to complete (as opposed to the global bdrv_drain_all() function). > > The approach taken in this series is to convert the blockdev.c monitor command > so it acquires the BlockDriverState's AioContext. Normally only 1 AioContext > is involved at a time but the mirror job's to_replace argument can involve a > second AioContext. > > Then the block job code itself is converted to defer main loop code using > block_job_defer_to_main_loop(). > > Example: > > $ qemu-system-x86_64 -enable-kvm -m 1024 \ > -drive if=none,id=drive0,file=test.img \ > -object iothread,iothread0 \ > -device virtio-blk-pci,drive=drive0,iothread=iothread0 > (qemu) drive_mirror drive0 test2.img > > Stefan Hajnoczi (11): > block: acquire AioContext in generic blockjob QMP commands > blockdev: acquire AioContext in do_qmp_query_block_jobs_one() > blockdev: acquire AioContext in blockdev_mark_auto_del() > blockdev: add note that block_job_cb() must be thread-safe > blockjob: add block_job_defer_to_main_loop() > block: add bdrv_drain() > block: let backup blockjob run in BDS AioContext > block: let stream blockjob run in BDS AioContext > block: let mirror blockjob run in BDS AioContext > block: let commit blockjob run in BDS AioContext > block: declare blockjobs and dataplane friends! > > block.c | 49 +++++++++-- > block/backup.c | 21 ++++- > block/commit.c | 70 ++++++++++------ > block/mirror.c | 85 +++++++++++++------ > block/stream.c | 50 +++++++---- > blockdev.c | 179 > +++++++++++++++++++++++++++++----------- > blockjob.c | 46 +++++++++++ > hw/block/dataplane/virtio-blk.c | 5 ++ > include/block/block.h | 1 + > include/block/blockjob.h | 19 +++++ > 10 files changed, 402 insertions(+), 123 deletions(-)
Applied to my block tree: https://github.com/stefanha/qemu/commits/block Stefan
pgplLUKV2BL99.pgp
Description: PGP signature