From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:53562) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qp1Ve-0004n9-KO for qemu-devel@nongnu.org; Thu, 04 Aug 2011 13:15:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qp1Vb-0001Lj-Kx for qemu-devel@nongnu.org; Thu, 04 Aug 2011 13:15:02 -0400 Received: from mail-wy0-f173.google.com ([74.125.82.173]:56803) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qp1Vb-0001Kh-Fg for qemu-devel@nongnu.org; Thu, 04 Aug 2011 13:14:59 -0400 Received: by mail-wy0-f173.google.com with SMTP id 20so1348207wye.4 for ; Thu, 04 Aug 2011 10:14:59 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Thu, 4 Aug 2011 19:14:42 +0200 Message-Id: <1312478089-806-5-git-send-email-pbonzini@redhat.com> In-Reply-To: <1312478089-806-1-git-send-email-pbonzini@redhat.com> References: <1312478089-806-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 04/10] dma-helpers: prepare for adding dma_buf_* functions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Store in the AIOCB which callback function we are using, and abstract the process of starting DMA. Signed-off-by: Paolo Bonzini --- dma-helpers.c | 22 +++++++++++++--------- 1 files changed, 13 insertions(+), 9 deletions(-) diff --git a/dma-helpers.c b/dma-helpers.c index d716524..4469ce2 100644 --- a/dma-helpers.c +++ b/dma-helpers.c @@ -78,9 +78,13 @@ void qemu_sglist_destroy(QEMUSGList *qsg) qemu_free(qsg->sg); } -typedef struct { +typedef struct DMAAIOCB DMAAIOCB; + +struct DMAAIOCB { BlockDriverAIOCB common; - BlockDriverState *bs; + union { + BlockDriverState *bs; + } u; BlockDriverAIOCB *acb; QEMUSGList *sg; uint64_t sector_num; @@ -88,9 +92,8 @@ typedef struct { QEMUIOVector iov; QEMUBH *bh; DMAIOFunc *io_func; -} DMAAIOCB; - -static int dma_bdrv_cb(DMAAIOCB *opaque, int ret); + int (*cb)(DMAAIOCB *, int); +}; static void dma_bdrv_unmap(DMAAIOCB *dbs) { @@ -122,11 +125,11 @@ static BlockDriverAIOCB *dma_continue(DMAAIOCB *dbs, int ret) { assert(ret != -EAGAIN); if (ret == 0) { - /* No error so far, try doing more DMA. If dma_bdrv_cb starts an + /* No error so far, try doing more DMA. If dbs->cb starts an asynchronous operation, it returns -EAGAIN and we will be called again by either reschedule_dma or dma_bdrv_aio_cb. If not, call the BlockDriverCompletionFunc. */ - ret = dma_bdrv_cb(dbs, ret); + ret = dbs->cb(dbs, ret); } if (ret != -EAGAIN) { dma_complete(dbs, ret); @@ -180,7 +183,7 @@ static int dma_bdrv_cb(DMAAIOCB *dbs, int ret) return -EAGAIN; } - dbs->acb = dbs->io_func(dbs->bs, dbs->sector_num, &dbs->iov, + dbs->acb = dbs->io_func(dbs->u.bs, dbs->sector_num, &dbs->iov, dbs->iov.size / 512, dma_bdrv_aio_cb, dbs); if (!dbs->acb) { dbs->common.cb = NULL; @@ -216,12 +219,13 @@ BlockDriverAIOCB *dma_bdrv_io( DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque); dbs->acb = NULL; - dbs->bs = bs; + dbs->u.bs = bs; dbs->sg = sg; dbs->sector_num = sector_num; dbs->is_write = is_write; dbs->io_func = io_func; dbs->bh = NULL; + dbs->cb = dma_bdrv_cb; qemu_iovec_init(&dbs->iov, sg->nsg); qemu_sglist_rewind(sg); return dma_continue(dbs, 0); -- 1.7.6