From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39511) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XEVVr-0002G5-9p for qemu-devel@nongnu.org; Mon, 04 Aug 2014 23:34:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XEVVl-0001Tk-3P for qemu-devel@nongnu.org; Mon, 04 Aug 2014 23:34:11 -0400 Received: from mail-pd0-f169.google.com ([209.85.192.169]:56148) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XEVVk-0001Tg-UJ for qemu-devel@nongnu.org; Mon, 04 Aug 2014 23:34:05 -0400 Received: by mail-pd0-f169.google.com with SMTP id y10so508978pdj.14 for ; Mon, 04 Aug 2014 20:34:04 -0700 (PDT) From: Ming Lei Date: Tue, 5 Aug 2014 11:33:04 +0800 Message-Id: <1407209598-2572-4-git-send-email-ming.lei@canonical.com> In-Reply-To: <1407209598-2572-1-git-send-email-ming.lei@canonical.com> References: <1407209598-2572-1-git-send-email-ming.lei@canonical.com> Subject: [Qemu-devel] [PATCH v1 03/17] qemu coroutine: support bypass mode List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, Peter Maydell , Paolo Bonzini , Stefan Hajnoczi Cc: Kevin Wolf , Ming Lei , Fam Zheng , "Michael S. Tsirkin" This patch introduces several APIs for supporting bypass qemu coroutine in case of being not necessary and for performance's sake. Signed-off-by: Ming Lei --- include/block/coroutine.h | 8 ++++++++ include/block/coroutine_int.h | 5 +++++ qemu-coroutine-lock.c | 4 ++-- qemu-coroutine.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/include/block/coroutine.h b/include/block/coroutine.h index b408f96..46d2642 100644 --- a/include/block/coroutine.h +++ b/include/block/coroutine.h @@ -223,4 +223,12 @@ void coroutine_fn co_aio_sleep_ns(AioContext *ctx, QEMUClockType type, * Note that this function clobbers the handlers for the file descriptor. */ void coroutine_fn yield_until_fd_readable(int fd); + +/* qemu coroutine bypass APIs */ +void qemu_coroutine_set_bypass(bool bypass); +bool qemu_coroutine_bypassed(Coroutine *self); +bool qemu_coroutine_self_bypassed(void); +void qemu_coroutine_set_var(void *var); +void *qemu_coroutine_get_var(void); + #endif /* QEMU_COROUTINE_H */ diff --git a/include/block/coroutine_int.h b/include/block/coroutine_int.h index f133d65..106d0b2 100644 --- a/include/block/coroutine_int.h +++ b/include/block/coroutine_int.h @@ -39,6 +39,11 @@ struct Coroutine { Coroutine *caller; QSLIST_ENTRY(Coroutine) pool_next; + bool bypass; + + /* only used in bypass mode */ + void *opaque; + /* Coroutines that should be woken up when we yield or terminate */ QTAILQ_HEAD(, Coroutine) co_queue_wakeup; QTAILQ_ENTRY(Coroutine) co_queue_next; diff --git a/qemu-coroutine-lock.c b/qemu-coroutine-lock.c index e4860ae..7c69ff6 100644 --- a/qemu-coroutine-lock.c +++ b/qemu-coroutine-lock.c @@ -82,13 +82,13 @@ static bool qemu_co_queue_do_restart(CoQueue *queue, bool single) bool coroutine_fn qemu_co_queue_next(CoQueue *queue) { - assert(qemu_in_coroutine()); + assert(qemu_in_coroutine() || qemu_coroutine_self_bypassed()); return qemu_co_queue_do_restart(queue, true); } void coroutine_fn qemu_co_queue_restart_all(CoQueue *queue) { - assert(qemu_in_coroutine()); + assert(qemu_in_coroutine() || qemu_coroutine_self_bypassed()); qemu_co_queue_do_restart(queue, false); } diff --git a/qemu-coroutine.c b/qemu-coroutine.c index 4708521..0597ed9 100644 --- a/qemu-coroutine.c +++ b/qemu-coroutine.c @@ -137,3 +137,36 @@ void coroutine_fn qemu_coroutine_yield(void) self->caller = NULL; coroutine_swap(self, to); } + +void qemu_coroutine_set_bypass(bool bypass) +{ + Coroutine *self = qemu_coroutine_self(); + + self->bypass = bypass; +} + +bool qemu_coroutine_bypassed(Coroutine *self) +{ + return self->bypass; +} + +bool qemu_coroutine_self_bypassed(void) +{ + Coroutine *self = qemu_coroutine_self(); + + return qemu_coroutine_bypassed(self); +} + +void qemu_coroutine_set_var(void *var) +{ + Coroutine *self = qemu_coroutine_self(); + + self->opaque = var; +} + +void *qemu_coroutine_get_var(void) +{ + Coroutine *self = qemu_coroutine_self(); + + return self->opaque; +} -- 1.7.9.5