v2: Drop the unfinished scsi part, which was broken in v1. (Paolo) Add refcnt in BlockDriverAIOCB to maintain invariant of acb availability in bdrv_aio_cancel_async. (Paolo) Drop blkdebug change. (Stefan)
This series adds a new block API: void bdrv_aio_cancel_async(BlockDriverAIOCB *acb); which is similar to existing bdrv_aio_cancel in that it cancels an AIO request, but different that it doesn't block until the request is completely cancelled or done. More importantly, the completion callback, BlockDriverAIOCB.cb, is guaranteed to be called, so that the cb can take care of resource releasing and status reporting to guest, etc. In the following work, scsi emulation code will be shifted to use the async cancelling. One major benefit would be that when guest tries to cancel a request, where the request cannot be cancelled easily, (due to throttled BlockDriverState, a lost connection, or a large request queue), we don't need to block the whole vm with a busy loop, which is how bdrv_aio_cancel is implemented now. A test case that is easy to reproduce is, throttle a scsi-disk to a very low limit, for example 50 bps, then stress the guest block device with dd or fio. Currently, the vm will quickly hang when it loses patience and sends a tmf command to cancel the request, at which point we will spin in bdrv_aio_cancel, until the request is slowly spit out from throttled_reqs. We should change scsi device code to make this asynchronous on top of bdrv_aio_cancel_async. Fam Fam Zheng (8): block: Add refcnt in BlockDriverAIOCB block: Add bdrv_aio_cancel_async tests: Add testing code for bdrv_aio_cancel_async linux-aio: Implement .cancel_async thread-pool: Implement .cancel_async dma: Implement .cancel_async block: Implement bdrv_em_co_aiocb_info.cancel_async iscsi: Implement .cancel_async in acb info block.c | 45 ++++++++++++++++++++++++++++++++++++- block/iscsi.c | 18 ++++++++++++--- block/linux-aio.c | 20 +++++++++++++++-- dma-helpers.c | 28 +++++++++++++++++++++++ include/block/aio.h | 3 +++ include/block/block.h | 1 + tests/test-thread-pool.c | 39 +++++++++++++++++++++++++------- thread-pool.c | 58 +++++++++++++++++++++++++++++++++++++++--------- 8 files changed, 187 insertions(+), 25 deletions(-) -- 2.1.0