From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34598) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X2JVP-0006Jz-PM for qemu-devel@nongnu.org; Wed, 02 Jul 2014 08:19:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X2JVJ-0003lo-1M for qemu-devel@nongnu.org; Wed, 02 Jul 2014 08:19:19 -0400 Received: from mail-pa0-f47.google.com ([209.85.220.47]:32789) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X2JVI-0003li-SG for qemu-devel@nongnu.org; Wed, 02 Jul 2014 08:19:12 -0400 Received: by mail-pa0-f47.google.com with SMTP id kq14so12382790pab.6 for ; Wed, 02 Jul 2014 05:19:12 -0700 (PDT) From: Ming Lei Date: Wed, 2 Jul 2014 20:18:46 +0800 Message-Id: <1404303528-7115-2-git-send-email-ming.lei@canonical.com> In-Reply-To: <1404303528-7115-1-git-send-email-ming.lei@canonical.com> References: <1404303528-7115-1-git-send-email-ming.lei@canonical.com> Subject: [Qemu-devel] [PATCH v4 1/3] block: block: introduce APIs for submitting IO as 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" a batch 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 217f523..4f64c38 100644 --- a/block.c +++ b/block.c @@ -1910,6 +1910,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); @@ -5774,3 +5775,33 @@ bool bdrv_is_first_non_filter(BlockDriverState *candidate) return false; } + +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 d0baf4f..7a8b990 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -578,4 +578,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 715c761..c5c4adc 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -257,6 +257,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