From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59773) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRx8l-0002W0-GZ for qemu-devel@nongnu.org; Thu, 11 Sep 2014 01:42:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XRx8f-0005rp-BQ for qemu-devel@nongnu.org; Thu, 11 Sep 2014 01:41:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]:21349) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRx8f-0005rc-4N for qemu-devel@nongnu.org; Thu, 11 Sep 2014 01:41:49 -0400 From: Fam Zheng Date: Thu, 11 Sep 2014 13:41:06 +0800 Message-Id: <1410414088-4419-1-git-send-email-famz@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v6 00/22] block: Asynchronous request cancellation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Benoit Canet , Peter Lieven , Stefan Hajnoczi , Liu Yuan , Paolo Bonzini v6: Drop bdrv_em_aiocb_info.cancel in patch 5. (Paolo) v5: Fix IDE callback. (Paolo) Fix blkdebug. (Paolo) Drop the DMA fix which is independent of this series. (Paolo) Incorperate Yuan's patch on quorum_aio_cancel. (Beno=C3=AEt) Commit message wording fix. (Beno=C3=AEt) Rename qemu_aio_release to qemu_aio_unref. (Beno=C3=AEt) 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 requ= est, but different that it doesn't block until the request is completely cance= lled or done. More importantly, the completion callback, BlockDriverAIOCB.cb, is guaran= teed to be called, so that the cb can take care of resource releasing and stat= us reporting to guest, etc. In the following work, scsi emulation code will be shifted to use the asy= nc cancelling. One major benefit would be that when guest tries to cancel a request, whe= re 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 v= m 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 (21): ide/ahci: Check for -ECANCELED in aio callbacks block: Add refcnt in BlockDriverAIOCB block: Add bdrv_aio_cancel_async block: Drop bdrv_em_co_aiocb_info.cancel block: Drop bdrv_em_aiocb_info.cancel thread-pool: Convert thread_pool_aiocb_info.cancel to cancel_async linux-aio: Convert laio_aiocb_info.cancel to .cancel_async 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: Drop blkdebug_aiocb_info.cancel 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: Rename qemu_aio_release -> qemu_aio_unref Liu Yuan (1): quorum: fix quorum_aio_cancel() block.c | 72 ++++++++++++++++++++++++------------------= ------ block/archipelago.c | 19 ++----------- block/blkdebug.c | 17 ++---------- block/blkverify.c | 21 +------------- block/curl.c | 16 ++++------- block/iscsi.c | 23 ++++------------ block/linux-aio.c | 34 +++++++---------------- block/qed.c | 23 +--------------- block/quorum.c | 11 ++++---- block/rbd.c | 25 ++--------------- block/sheepdog.c | 54 ++++++++++++++++-------------------- block/win32-aio.c | 18 ++---------- dma-helpers.c | 20 +++----------- hw/ide/ahci.c | 3 ++ hw/ide/core.c | 26 +++++++++++------ include/block/aio.h | 7 +++-- include/block/block.h | 1 + tests/test-thread-pool.c | 34 +++++++++++++++++------ thread-pool.c | 36 +++++++++++------------- 19 files changed, 167 insertions(+), 293 deletions(-) --=20 1.9.3