From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53031) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X7S7P-0001CU-Qf for qemu-devel@nongnu.org; Wed, 16 Jul 2014 12:31:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X7S7J-0000ua-3g for qemu-devel@nongnu.org; Wed, 16 Jul 2014 12:31:47 -0400 Received: from mail-pa0-f53.google.com ([209.85.220.53]:59588) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X7S7I-0000uU-Tx for qemu-devel@nongnu.org; Wed, 16 Jul 2014 12:31:41 -0400 Received: by mail-pa0-f53.google.com with SMTP id kq14so1570478pab.26 for ; Wed, 16 Jul 2014 09:31:40 -0700 (PDT) From: Ming Lei Date: Thu, 17 Jul 2014 00:31:08 +0800 Message-Id: <1405528281-23744-2-git-send-email-ming.lei@canonical.com> In-Reply-To: <1405528281-23744-1-git-send-email-ming.lei@canonical.com> References: <1405528281-23744-1-git-send-email-ming.lei@canonical.com> Subject: [Qemu-devel] [PATCH RFC 01/14] qemu coroutine: support bypass mode List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, 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 | 7 +++++++ include/block/coroutine_int.h | 5 +++++ qemu-coroutine-lock.c | 4 ++-- qemu-coroutine.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/include/block/coroutine.h b/include/block/coroutine.h index b9b7f48..9bd64da 100644 --- a/include/block/coroutine.h +++ b/include/block/coroutine.h @@ -234,4 +234,11 @@ void coroutine_fn yield_until_fd_readable(int fd); */ void qemu_coroutine_adjust_pool_size(int n); +/* 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 bd574aa..324f5ad 100644 --- a/qemu-coroutine.c +++ b/qemu-coroutine.c @@ -157,3 +157,36 @@ void qemu_coroutine_adjust_pool_size(int n) qemu_mutex_unlock(&pool_lock); } + +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