From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44760) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X2tq6-000443-VA for qemu-devel@nongnu.org; Thu, 03 Jul 2014 23:07:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X2tq0-00030b-ML for qemu-devel@nongnu.org; Thu, 03 Jul 2014 23:07:06 -0400 Received: from mail-pd0-f171.google.com ([209.85.192.171]:55119) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X2tq0-00030V-Gw for qemu-devel@nongnu.org; Thu, 03 Jul 2014 23:07:00 -0400 Received: by mail-pd0-f171.google.com with SMTP id fp1so1221222pdb.16 for ; Thu, 03 Jul 2014 20:06:58 -0700 (PDT) From: Ming Lei Date: Fri, 4 Jul 2014 11:06:40 +0800 Message-Id: <1404443202-14174-2-git-send-email-ming.lei@canonical.com> In-Reply-To: <1404443202-14174-1-git-send-email-ming.lei@canonical.com> References: <1404443202-14174-1-git-send-email-ming.lei@canonical.com> Subject: [Qemu-devel] [PATCH v5 1/3] block: block: introduce APIs for submitting IO as a batch List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell , qemu-devel@nongnu.org, Paolo Bonzini , Stefan Hajnoczi Cc: Kevin Wolf , Ming Lei , Fam Zheng , "Michael S. Tsirkin" This patch introduces three APIs so that following patches can support queuing I/O requests and submitting them as a batch for improving I/O performance. Reviewed-by: Paolo Bonzini Signed-off-by: Ming Lei --- block.c | 31 +++++++++++++++++++++++++++++++ include/block/block.h | 4 ++++ include/block/block_int.h | 5 +++++ 3 files changed, 40 insertions(+) diff --git a/block.c b/block.c index f80e2b2..8800a6b 100644 --- a/block.c +++ b/block.c @@ -1905,6 +1905,7 @@ void bdrv_drain_all(void) bool bs_busy; aio_context_acquire(aio_context); + bdrv_flush_io_queue(bs); bdrv_start_throttled_reqs(bs); bs_busy = bdrv_requests_pending(bs); bs_busy |= aio_poll(aio_context, bs_busy); @@ -5782,3 +5783,33 @@ BlockDriverState *check_to_replace_node(const char *node_name, Error **errp) return to_replace_bs; } + +void bdrv_io_plug(BlockDriverState *bs) +{ + BlockDriver *drv = bs->drv; + if (drv && drv->bdrv_io_plug) { + drv->bdrv_io_plug(bs); + } else if (bs->file) { + bdrv_io_plug(bs->file); + } +} + +void bdrv_io_unplug(BlockDriverState *bs) +{ + BlockDriver *drv = bs->drv; + if (drv && drv->bdrv_io_unplug) { + drv->bdrv_io_unplug(bs); + } else if (bs->file) { + bdrv_io_unplug(bs->file); + } +} + +void bdrv_flush_io_queue(BlockDriverState *bs) +{ + BlockDriver *drv = bs->drv; + if (drv && drv->bdrv_flush_io_queue) { + drv->bdrv_flush_io_queue(bs); + } else if (bs->file) { + bdrv_flush_io_queue(bs->file); + } +} diff --git a/include/block/block.h b/include/block/block.h index baecc26..32d3676 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -584,4 +584,8 @@ AioContext *bdrv_get_aio_context(BlockDriverState *bs); */ void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context); +void bdrv_io_plug(BlockDriverState *bs); +void bdrv_io_unplug(BlockDriverState *bs); +void bdrv_flush_io_queue(BlockDriverState *bs); + #endif diff --git a/include/block/block_int.h b/include/block/block_int.h index 8f8e65e..f6c3bef 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -261,6 +261,11 @@ struct BlockDriver { void (*bdrv_attach_aio_context)(BlockDriverState *bs, AioContext *new_context); + /* io queue for linux-aio */ + void (*bdrv_io_plug)(BlockDriverState *bs); + void (*bdrv_io_unplug)(BlockDriverState *bs); + void (*bdrv_flush_io_queue)(BlockDriverState *bs); + QLIST_ENTRY(BlockDriver) list; }; -- 1.7.9.5