From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lw1kE-00032c-9H for qemu-devel@nongnu.org; Mon, 20 Apr 2009 18:13:42 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lw1k9-00030B-0M for qemu-devel@nongnu.org; Mon, 20 Apr 2009 18:13:41 -0400 Received: from [199.232.76.173] (port=58110 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lw1k8-000305-HX for qemu-devel@nongnu.org; Mon, 20 Apr 2009 18:13:36 -0400 Received: from e38.co.us.ibm.com ([32.97.110.159]:44368) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Lw1k8-0006Px-70 for qemu-devel@nongnu.org; Mon, 20 Apr 2009 18:13:36 -0400 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e38.co.us.ibm.com (8.13.1/8.13.1) with ESMTP id n3KMB8PD019929 for ; Mon, 20 Apr 2009 16:11:08 -0600 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v9.2) with ESMTP id n3KMDYI3055502 for ; Mon, 20 Apr 2009 16:13:34 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n3KMDXaC005407 for ; Mon, 20 Apr 2009 16:13:34 -0600 From: Ryan Harper Date: Mon, 20 Apr 2009 17:13:20 -0500 Message-Id: <1240265600-9469-4-git-send-email-ryanh@us.ibm.com> In-Reply-To: <1240265600-9469-1-git-send-email-ryanh@us.ibm.com> References: <1240265600-9469-1-git-send-email-ryanh@us.ibm.com> Subject: [Qemu-devel] [STABLE][PATCH 3/3] Implement cancellation method for dma async I/O List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , Ryan Harper , Avi Kivity Rebased on qemu-stable. Move the dma helpers to a private aio pool, and implement a cancellation method for them. Should prevent issues when cancelling I/O while dma is in progress. Signed-off-by: Avi Kivity diff --git a/dma-helpers.c b/dma-helpers.c index b2ade19..19fa4f0 100644 --- a/dma-helpers.c +++ b/dma-helpers.c @@ -10,6 +10,8 @@ #include "dma.h" #include "block_int.h" +static AIOPool dma_aio_pool; + void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint) { qsg->sg = qemu_malloc(alloc_hint * sizeof(ScatterGatherEntry)); @@ -126,7 +128,7 @@ static BlockDriverAIOCB *dma_bdrv_io( DMABlockState *dbs = qemu_malloc(sizeof(*dbs)); dbs->bs = bs; - dbs->acb = qemu_aio_get(bs, cb, opaque); + dbs->acb = qemu_aio_get_pool(&dma_aio_pool, bs, cb, opaque); dbs->sg = sg; dbs->sector_num = sector_num; dbs->sg_cur_index = 0; @@ -153,3 +155,14 @@ BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, return dma_bdrv_io(bs, sg, sector, cb, opaque, 1); } +static void dma_aio_cancel(BlockDriverAIOCB *acb) +{ + DMABlockState *dbs = (DMABlockState *)acb->opaque; + + bdrv_aio_cancel(dbs->acb); +} + +void dma_helper_init(void) +{ + aio_pool_init(&dma_aio_pool, sizeof(BlockDriverAIOCB), dma_aio_cancel); +} diff --git a/dma.h b/dma.h index d596717..7d2ab45 100644 --- a/dma.h +++ b/dma.h @@ -37,5 +37,6 @@ BlockDriverAIOCB *dma_bdrv_read(BlockDriverState *bs, BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, QEMUSGList *sg, uint64_t sector, BlockDriverCompletionFunc *cb, void *opaque); +void dma_helper_init(void); #endif diff --git a/vl.c b/vl.c index 54ae45b..d6d8307 100644 --- a/vl.c +++ b/vl.c @@ -5485,6 +5485,7 @@ int main(int argc, char **argv, char **envp) cpu_exec_init_all(tb_size * 1024 * 1024); bdrv_init(); + dma_helper_init(); /* we always create the cdrom drive, even if no disk is there */