From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38346) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b7fmP-0006Lh-PV for qemu-devel@nongnu.org; Tue, 31 May 2016 05:16:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b7fmL-0005XL-2d for qemu-devel@nongnu.org; Tue, 31 May 2016 05:16:05 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:40946 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b7fmK-0005X7-Ei for qemu-devel@nongnu.org; Tue, 31 May 2016 05:16:01 -0400 From: "Denis V. Lunev" Date: Tue, 31 May 2016 12:15:26 +0300 Message-Id: <1464686130-12265-8-git-send-email-den@openvz.org> In-Reply-To: <1464686130-12265-1-git-send-email-den@openvz.org> References: <1464686130-12265-1-git-send-email-den@openvz.org> Subject: [Qemu-devel] [PATCH 07/11] block: optimization blk_pwrite_compressed() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: den@openvz.org, Pavel Butsykin , Jeff Cody , Markus Armbruster , Eric Blake , John Snow , Stefan Hajnoczi , Kevin Wolf From: Pavel Butsykin For bdrv_pwrite_compressed() it looks like most of the code creating coroutine is duplicated in blk_prw(). So we can just add a flag(BDRV_REQ_WRITE_COMPRESSED) and use the blk_prw() as a generic one. Signed-off-by: Pavel Butsykin Signed-off-by: Denis V. Lunev CC: Jeff Cody CC: Markus Armbruster CC: Eric Blake CC: John Snow CC: Stefan Hajnoczi CC: Kevin Wolf --- block/block-backend.c | 19 +++++++++++------ block/io.c | 48 ------------------------------------------ include/block/block.h | 3 +-- include/sysemu/block-backend.h | 3 +++ 4 files changed, 17 insertions(+), 56 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index 3c1fc50..9e1c793 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -785,7 +785,11 @@ int coroutine_fn blk_co_pwritev(BlockBackend *blk, int64_t offset, flags |= BDRV_REQ_FUA; } - return bdrv_co_pwritev(blk_bs(blk), offset, bytes, qiov, flags); + if (flags & BDRV_REQ_WRITE_COMPRESSED) { + return bdrv_co_pwritev_compressed(blk_bs(blk), offset, bytes, qiov); + } else { + return bdrv_co_pwritev(blk_bs(blk), offset, bytes, qiov, flags); + } } typedef struct BlkRwCo { @@ -1480,12 +1484,15 @@ int coroutine_fn blk_co_pwrite_zeroes(BlockBackend *blk, int64_t offset, int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf, int count) { - int ret = blk_check_byte_request(blk, offset, count); - if (ret < 0) { - return ret; - } + return blk_prw(blk, offset, (void *) buf, count, blk_write_entry, + BDRV_REQ_WRITE_COMPRESSED); +} - return bdrv_pwrite_compressed(blk_bs(blk), offset, buf, count); +int coroutine_fn blk_co_pwritev_compressed(BlockBackend *blk, int64_t offset, + unsigned int bytes, + QEMUIOVector *qiov) +{ + return blk_co_pwritev(blk, offset, bytes, qiov, BDRV_REQ_WRITE_COMPRESSED); } int blk_truncate(BlockBackend *blk, int64_t offset) diff --git a/block/io.c b/block/io.c index 4b06de8..29f5962 100644 --- a/block/io.c +++ b/block/io.c @@ -1805,54 +1805,6 @@ int coroutine_fn bdrv_co_pwritev_compressed(BlockDriverState *bs, bytes >> BDRV_SECTOR_BITS, qiov); } -typedef struct BdrvWriteCompressedCo { - BlockDriverState *bs; - int64_t offset; - QEMUIOVector *qiov; - int ret; -} BdrvWriteCompressedCo; - -static void bdrv_write_compressed_co_entry(void *opaque) -{ - BdrvWriteCompressedCo *co = opaque; - - co->ret = bdrv_co_pwritev_compressed(co->bs, co->offset, co->qiov->size, - co->qiov); -} - -int bdrv_pwrite_compressed(BlockDriverState *bs, int64_t offset, - const void *buf, int count) -{ - BdrvWriteCompressedCo data; - QEMUIOVector qiov; - struct iovec iov = { - .iov_base = (void *)buf, - .iov_len = count, - }; - qemu_iovec_init_external(&qiov, &iov, 1); - - data = (BdrvWriteCompressedCo) { - .bs = bs, - .offset = offset, - .qiov = &qiov, - .ret = -EINPROGRESS, - }; - - if (qemu_in_coroutine()) { - /* Fast-path if already in coroutine context */ - bdrv_write_compressed_co_entry(&data); - } else { - AioContext *aio_context = bdrv_get_aio_context(bs); - - Coroutine *co = qemu_coroutine_create(bdrv_write_compressed_co_entry); - qemu_coroutine_enter(co, &data); - while (data.ret == -EINPROGRESS) { - aio_poll(aio_context, true); - } - } - return data.ret; -} - int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf, int64_t pos, int size) { diff --git a/include/block/block.h b/include/block/block.h index b687c0d..56fcab6 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -65,6 +65,7 @@ typedef enum { BDRV_REQ_MAY_UNMAP = 0x4, BDRV_REQ_NO_SERIALISING = 0x8, BDRV_REQ_FUA = 0x10, + BDRV_REQ_WRITE_COMPRESSED = 0x20, } BdrvRequestFlags; typedef struct BlockSizes { @@ -421,8 +422,6 @@ const char *bdrv_get_node_name(const BlockDriverState *bs); const char *bdrv_get_device_name(const BlockDriverState *bs); const char *bdrv_get_device_or_node_name(const BlockDriverState *bs); int bdrv_get_flags(BlockDriverState *bs); -int bdrv_pwrite_compressed(BlockDriverState *bs, int64_t offset, - const void *buf, int count); int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi); ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs); void bdrv_round_to_clusters(BlockDriverState *bs, diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 57df069..3d7b446 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -205,6 +205,9 @@ int coroutine_fn blk_co_pwrite_zeroes(BlockBackend *blk, int64_t offset, int count, BdrvRequestFlags flags); int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf, int count); +int coroutine_fn blk_co_pwritev_compressed(BlockBackend *blk, int64_t offset, + unsigned int bytes, + QEMUIOVector *qiov); int blk_truncate(BlockBackend *blk, int64_t offset); int blk_discard(BlockBackend *blk, int64_t sector_num, int nb_sectors); int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf, -- 2.1.4