From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:40778) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S5gwK-0004Dy-E1 for qemu-devel@nongnu.org; Thu, 08 Mar 2012 12:16:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S5gwG-0004ok-Kt for qemu-devel@nongnu.org; Thu, 08 Mar 2012 12:15:43 -0500 Received: from mail-yw0-f45.google.com ([209.85.213.45]:52155) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S5gwG-0004oW-F9 for qemu-devel@nongnu.org; Thu, 08 Mar 2012 12:15:40 -0500 Received: by yhoo21 with SMTP id o21so436011yho.4 for ; Thu, 08 Mar 2012 09:15:38 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Thu, 8 Mar 2012 18:15:05 +0100 Message-Id: <1331226917-6658-6-git-send-email-pbonzini@redhat.com> In-Reply-To: <1331226917-6658-1-git-send-email-pbonzini@redhat.com> References: <1331226917-6658-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [RFC PATCH 05/17] block: pass around qiov for write_zeroes operation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Avoid allocating an extra, useless bounce buffer if possible. Signed-off-by: Paolo Bonzini --- block.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) diff --git a/block.c b/block.c index 52ffe14..e4f7782 100644 --- a/block.c +++ b/block.c @@ -72,6 +72,8 @@ static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs, static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *qiov, BdrvRequestFlags flags); +static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs, + int64_t sector_num, int nb_sectors, QEMUIOVector *qiov); static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, @@ -1676,8 +1678,8 @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BlockDriverState *bs, if (drv->bdrv_co_write_zeroes && buffer_is_zero(bounce_buffer, iov.iov_len)) { - ret = drv->bdrv_co_write_zeroes(bs, cluster_sector_num, - cluster_nb_sectors); + ret = bdrv_co_do_write_zeroes(bs, cluster_sector_num, + cluster_nb_sectors, &bounce_qiov); } else { ret = drv->bdrv_co_writev(bs, cluster_sector_num, cluster_nb_sectors, &bounce_qiov); @@ -1780,10 +1782,10 @@ int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs, } static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs, - int64_t sector_num, int nb_sectors) + int64_t sector_num, int nb_sectors, QEMUIOVector *qiov) { BlockDriver *drv = bs->drv; - QEMUIOVector qiov; + QEMUIOVector my_qiov; struct iovec iov; int ret; @@ -1792,13 +1794,17 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs, return drv->bdrv_co_write_zeroes(bs, sector_num, nb_sectors); } + if (qiov) { + return drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov); + } + /* Fall back to bounce buffer if write zeroes is unsupported */ iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE; iov.iov_base = qemu_blockalign(bs, iov.iov_len); memset(iov.iov_base, 0, iov.iov_len); - qemu_iovec_init_external(&qiov, &iov, 1); + qemu_iovec_init_external(&my_qiov, &iov, 1); - ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, &qiov); + ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, &my_qiov); qemu_vfree(iov.iov_base); return ret; @@ -1837,7 +1843,7 @@ static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs, tracked_request_begin(&req, bs, sector_num, nb_sectors, true); if (flags & BDRV_REQ_ZERO_WRITE) { - ret = bdrv_co_do_write_zeroes(bs, sector_num, nb_sectors); + ret = bdrv_co_do_write_zeroes(bs, sector_num, nb_sectors, qiov); } else { ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov); } -- 1.7.7.6