From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38014) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XnN9w-00015e-Vp for qemu-devel@nongnu.org; Sun, 09 Nov 2014 02:43:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XnN9q-00014C-TH for qemu-devel@nongnu.org; Sun, 09 Nov 2014 02:43:40 -0500 Received: from mail-pa0-f50.google.com ([209.85.220.50]:47672) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XnN9q-000148-N3 for qemu-devel@nongnu.org; Sun, 09 Nov 2014 02:43:34 -0500 Received: by mail-pa0-f50.google.com with SMTP id eu11so6147601pac.23 for ; Sat, 08 Nov 2014 23:43:34 -0800 (PST) From: Ming Lei Date: Sun, 9 Nov 2014 15:42:51 +0800 Message-Id: <1415518978-2837-7-git-send-email-ming.lei@canonical.com> In-Reply-To: <1415518978-2837-1-git-send-email-ming.lei@canonical.com> References: <1415518978-2837-1-git-send-email-ming.lei@canonical.com> Subject: [Qemu-devel] [PATCH 06/13] AioContext: introduce aio_attach_aio_bs() and its pair List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, Peter Maydell , Paolo Bonzini , Stefan Hajnoczi , Kevin Wolf Cc: Ming Lei , Fam Zheng This patch introduces aio_attach_aio_bs() and its pair for supporting IO submission as batch in AioContext wide, and one typical use case is multi-lun SCSI. aio_attach_aio_bs() will attach one 'bs' which is capable of IO submission as batch, then all I/O submission in this AioContext will borrow the io queue from this 'bs', so that we can maximum IO submission as batch. aio_detach_aio_bs() will detach the 'bs' when all 'bs' in the AioContext is detached. Signed-off-by: Ming Lei --- async.c | 1 + include/block/aio.h | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/async.c b/async.c index 6e1b282..0f4b530 100644 --- a/async.c +++ b/async.c @@ -305,6 +305,7 @@ AioContext *aio_context_new(Error **errp) event_notifier_test_and_clear); ctx->pollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD)); ctx->thread_pool = NULL; + ctx->bs_refcnt = 0; qemu_mutex_init(&ctx->bh_lock); rfifolock_init(&ctx->lock, aio_rfifolock_cb, ctx); timerlistgroup_init(&ctx->tlg, aio_timerlist_notify, ctx); diff --git a/include/block/aio.h b/include/block/aio.h index 6bf0e04..e34a21f 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -90,6 +90,11 @@ struct AioContext { /* TimerLists for calling timers - one per clock type */ QEMUTimerListGroup tlg; + + /* IO submit as batch in AioContext wide */ + BlockDriverState *master_aio_bs; + int bs_refcnt; + void *opaque; }; /* Used internally to synchronize aio_poll against qemu_bh_schedule. */ @@ -325,4 +330,26 @@ static inline void aio_timer_init(AioContext *ctx, */ int64_t aio_compute_timeout(AioContext *ctx); +static inline bool aio_attach_aio_bs(AioContext *ctx, + BlockDriverState *bs) +{ + if (!ctx->bs_refcnt++) { + ctx->master_aio_bs = bs; + return true; + } + + return false; +} + +static inline bool aio_detach_aio_bs(AioContext *ctx, + BlockDriverState *bs) +{ + if (!--ctx->bs_refcnt) { + ctx->master_aio_bs = NULL; + return true; + } + + return false; +} + #endif -- 1.7.9.5