v4: Drop AIOCBInfo.cancel. This series adds a new block layer API:
void bdrv_aio_cancel_async(BlockDriverAIOCB *acb); And use it to emulate bdrv_aio_cancel. The function is similar to 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 send a tmf command to cancel the request, at which point we will busy wait in bdrv_aio_cancel, until the request is slowly spit out from throttled_reqs. Later, we will change scsi device code to make this asynchronous, on top of bdrv_aio_cancel_async. Fam Fam Zheng (20): block: Add refcnt in BlockDriverAIOCB block: Add bdrv_aio_cancel_async block: Drop bdrv_em_co_aiocb_info.cancel block: Convert bdrv_em_aiocb_info.cancel to .cancel_async thread-pool: Convert thread_pool_aiocb_info.cancel to cancel_async linux-aio: Convert laio_aiocb_info.cancel to .cancel_async dma: Check iov pointer before unmap memory dma: Convert dma_aiocb_info.cancel to .cancel_async iscsi: Convert iscsi_aiocb_info.cancel to .cancel_async archipelago: Drop archipelago_aiocb_info.cancel blkdebug: Convert blkdebug_aiocb_info.cancel to .cancel_async blkverify: Drop blkverify_aiocb_info.cancel curl: Drop curl_aiocb_info.cancel qed: Drop qed_aiocb_info.cancel quorum: Convert quorum_aiocb_info.cancel to .cancel_async rbd: Drop rbd_aiocb_info.cancel sheepdog: Convert sd_aiocb_info.cancel to .cancel_async win32-aio: Drop win32_aiocb_info.cancel ide: Convert trim_aiocb_info.cancel to .cancel_async block: Drop AIOCBInfo.cancel block.c | 61 +++++++++++++++++++++++++++++------------------- block/archipelago.c | 17 +------------- block/blkdebug.c | 6 +++-- block/blkverify.c | 19 --------------- block/curl.c | 6 ----- block/iscsi.c | 17 ++------------ block/linux-aio.c | 30 +++++++----------------- block/qed.c | 21 ----------------- block/quorum.c | 7 ++---- block/rbd.c | 23 +----------------- block/sheepdog.c | 46 +++++++++++++++--------------------- block/win32-aio.c | 14 ----------- dma-helpers.c | 23 ++++++------------ hw/ide/core.c | 12 ++++------ include/block/aio.h | 5 +++- include/block/block.h | 1 + tests/test-thread-pool.c | 34 ++++++++++++++++++++------- thread-pool.c | 32 +++++++++++-------------- 18 files changed, 131 insertions(+), 243 deletions(-) -- 2.1.0.27.g96db324