From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35636) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XKQz5-000186-BE for qemu-devel@nongnu.org; Thu, 21 Aug 2014 07:56:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XKQyz-000681-6Q for qemu-devel@nongnu.org; Thu, 21 Aug 2014 07:56:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:5751) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XKQyy-00067n-VL for qemu-devel@nongnu.org; Thu, 21 Aug 2014 07:56:45 -0400 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7LBuhXR022067 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 21 Aug 2014 07:56:43 -0400 From: Fam Zheng Date: Thu, 21 Aug 2014 19:56:47 +0800 Message-Id: <1408622216-9578-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [RFC PATCH 0/9] scsi, block: Asynchronous request cancellation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Paolo Bonzini , Stefan Hajnoczi 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. Because of this, 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. The first patches introduces the interface and a (default) degradad implementation, which is emulated with bdrv_aio_cancel. Then some testing on it is added in patch 2. Following patches are the implementation of .cancel_async in several AIOCBInfo structures. Note that blkldebug's and iscsi's implementations are not tested, just for the purpose to see what it takes to implement it. In the long term, we may consider completely dropping bdrv_aio_cancel, if it turns out the asynchronous version works better. The callers are not many, and it feels counterintuitive to have a synchronous bdrv_aio_* function. In the end, scsi emulation code is shifted to the async cancelling. One major benefit is 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 no longer need to block the whole vm with a busy wait polling loop, which is how bdrv_aio_cancel is implemented now. To test this series, you can throttle a scsi-disk to a very low limit, for example 50 bps, then stress the guest block device with dd or fio. Before, 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. After, the guest is not blocked, so the responsiveness of the VM is much better. The same applies for a disappeared/hung (nfs, iscsi, etc.) storage target. Last but not least, the remaing users of bdrv_aio_cancel, after this series, are only 4: block/quorum.c hw/block/nvme.c hw/ide/ahci.c hw/ide/core.c I said too many things that you already knew. Please review and make any comments! Thank you very much! Fam Fam Zheng (9): block: Add bdrv_aio_cancel_async tests: Add testing code for bdrv_aio_cancel_async iscsi: Implement .cancel_async in acb info linux-aio: Implement .cancel_async thread-pool: Implement .cancel_async blkdebug: Implement .cancel_async dma: Implement .cancel_async block: Implement stub bdrv_em_co_aiocb_info.cancel_async scsi: Cancel request asynchronously block.c | 40 +++++++++++++++++++++++++++++++++ block/blkdebug.c | 20 +++++++++++------ block/iscsi.c | 18 ++++++++++++--- block/linux-aio.c | 20 +++++++++++++++-- dma-helpers.c | 28 +++++++++++++++++++++++ hw/scsi/scsi-bus.c | 6 ++--- hw/scsi/scsi-disk.c | 41 +++++++++------------------------- hw/scsi/scsi-generic.c | 21 +++++------------- include/block/aio.h | 2 ++ include/block/block.h | 1 + tests/test-thread-pool.c | 39 +++++++++++++++++++++++++------- thread-pool.c | 58 +++++++++++++++++++++++++++++++++++++++--------- 12 files changed, 213 insertions(+), 81 deletions(-) -- 2.0.3