From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:58943) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REkuI-0006yN-8I for qemu-devel@nongnu.org; Fri, 14 Oct 2011 12:46:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1REkuG-0001G7-Ei for qemu-devel@nongnu.org; Fri, 14 Oct 2011 12:46:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:9797) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REkuG-0001Fz-7F for qemu-devel@nongnu.org; Fri, 14 Oct 2011 12:46:48 -0400 From: Kevin Wolf Date: Fri, 14 Oct 2011 18:49:13 +0200 Message-Id: <1318610959-17971-19-git-send-email-kwolf@redhat.com> In-Reply-To: <1318610959-17971-1-git-send-email-kwolf@redhat.com> References: <1318610959-17971-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 18/24] block: switch bdrv_aio_writev() to coroutines List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Stefan Hajnoczi More sync, aio, and coroutine unification. Make bdrv_aio_writev() go through coroutine request processing. Remove the dirty block callback mechanism which was needed only for aio processing and can be done more naturally in coroutine context. Signed-off-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- block.c | 66 +------------------------------------------------------------- 1 files changed, 2 insertions(+), 64 deletions(-) diff --git a/block.c b/block.c index 02e15ca..8c7d05e 100644 --- a/block.c +++ b/block.c @@ -2385,76 +2385,14 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, cb, opaque, false, bdrv_co_do_rw); } -typedef struct BlockCompleteData { - BlockDriverCompletionFunc *cb; - void *opaque; - BlockDriverState *bs; - int64_t sector_num; - int nb_sectors; -} BlockCompleteData; - -static void block_complete_cb(void *opaque, int ret) -{ - BlockCompleteData *b = opaque; - - if (b->bs->dirty_bitmap) { - set_dirty_bitmap(b->bs, b->sector_num, b->nb_sectors, 1); - } - b->cb(b->opaque, ret); - g_free(b); -} - -static BlockCompleteData *blk_dirty_cb_alloc(BlockDriverState *bs, - int64_t sector_num, - int nb_sectors, - BlockDriverCompletionFunc *cb, - void *opaque) -{ - BlockCompleteData *blkdata = g_malloc0(sizeof(BlockCompleteData)); - - blkdata->bs = bs; - blkdata->cb = cb; - blkdata->opaque = opaque; - blkdata->sector_num = sector_num; - blkdata->nb_sectors = nb_sectors; - - return blkdata; -} - BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, BlockDriverCompletionFunc *cb, void *opaque) { - BlockDriver *drv = bs->drv; - BlockDriverAIOCB *ret; - BlockCompleteData *blk_cb_data; - trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque); - if (!drv) - return NULL; - if (bs->read_only) - return NULL; - if (bdrv_check_request(bs, sector_num, nb_sectors)) - return NULL; - - if (bs->dirty_bitmap) { - blk_cb_data = blk_dirty_cb_alloc(bs, sector_num, nb_sectors, cb, - opaque); - cb = &block_complete_cb; - opaque = blk_cb_data; - } - - ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors, - cb, opaque); - - if (ret) { - if (bs->wr_highest_sector < sector_num + nb_sectors - 1) { - bs->wr_highest_sector = sector_num + nb_sectors - 1; - } - } - - return ret; + return bdrv_co_aio_rw_vector(bs, sector_num, qiov, nb_sectors, + cb, opaque, true, bdrv_co_do_rw); } -- 1.7.6.4