From patchwork Tue Sep 25 12:44:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 186797 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 441772C0080 for ; Tue, 25 Sep 2012 22:44:41 +1000 (EST) Received: from localhost ([::1]:57251 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGUVD-0000D5-EY for incoming@patchwork.ozlabs.org; Tue, 25 Sep 2012 08:44:39 -0400 Received: from eggs.gnu.org ([208.118.235.92]:55105) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGUV1-0000C4-Lb for qemu-devel@nongnu.org; Tue, 25 Sep 2012 08:44:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TGUUx-0004Mk-Jy for qemu-devel@nongnu.org; Tue, 25 Sep 2012 08:44:27 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:33436) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGUUx-0004Ma-EU for qemu-devel@nongnu.org; Tue, 25 Sep 2012 08:44:23 -0400 Received: by pbbrp2 with SMTP id rp2so51138pbb.4 for ; Tue, 25 Sep 2012 05:44:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer; bh=/170mPuKEvNVpmv0xGinaJjxdzNvXBSIhFExCtZXwIc=; b=0PEt9tl5k1/C05FSZ2NPwXxdgE0d3B2u7kJMrC3CK2kY8OoXfA4n7ytpt5dv4wSpC8 BVp2ALMhLoWga7xICBOgftH4WVewZQ9S5zCcViwUdDK3w/sz3rcFSt4m089Wwniwbyvz s4RDEIQglcDSb/+hGyM42yZX/Htnbx+3sKNk/5eq/h8tki83ZWPd0/c4ynRmXxybm85c 6hyoWzYPnrnBLEDfeS9IcuWPsUwk1hAJfhfBQSZOy3ZLYcdjYvY52zBFeeczwbSe3Mz6 L9Atlgxggn+TbmkNPPFrsogQjPQBsUkDyrBFng0g1EzhirPTRDJ5+vGlY+RQarb3TFfE XlLg== Received: by 10.68.189.193 with SMTP id gk1mr45434209pbc.123.1348577062098; Tue, 25 Sep 2012 05:44:22 -0700 (PDT) Received: from yakj.usersys.redhat.com (93-34-169-1.ip50.fastwebnet.it. [93.34.169.1]) by mx.google.com with ESMTPS id kj10sm282874pbc.72.2012.09.25.05.44.18 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 25 Sep 2012 05:44:20 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 25 Sep 2012 14:44:06 +0200 Message-Id: <1348577046-12643-1-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.12 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.160.45 Cc: kwolf@redhat.com, stefanha@gmail.com Subject: [Qemu-devel] [PATCH] coroutine: always use pooling X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org It makes sense to use it for other implementations than ucontext, too. Signed-off-by: Paolo Bonzini --- coroutine-ucontext.c | 43 +------------------------------------------ qemu-coroutine.c | 38 ++++++++++++++++++++++++++++++++++++-- 2 file modificati, 37 inserzioni(+), 44 rimozioni(-) diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c index 784081a..744f4f6 100644 --- a/coroutine-ucontext.c +++ b/coroutine-ucontext.c @@ -34,15 +34,6 @@ #include #endif -enum { - /* Maximum free pool size prevents holding too many freed coroutines */ - POOL_MAX_SIZE = 64, -}; - -/** Free list to speed up creation */ -static QSLIST_HEAD(, Coroutine) pool = QSLIST_HEAD_INITIALIZER(pool); -static unsigned int pool_size; - typedef struct { Coroutine base; void *stack; @@ -96,17 +87,6 @@ static void qemu_coroutine_thread_cleanup(void *opaque) g_free(s); } -static void __attribute__((destructor)) coroutine_cleanup(void) -{ - Coroutine *co; - Coroutine *tmp; - - QSLIST_FOREACH_SAFE(co, &pool, pool_next, tmp) { - g_free(DO_UPCAST(CoroutineUContext, base, co)->stack); - g_free(co); - } -} - static void __attribute__((constructor)) coroutine_init(void) { int ret; @@ -140,7 +120,7 @@ static void coroutine_trampoline(int i0, int i1) } } -static Coroutine *coroutine_new(void) +Coroutine *qemu_coroutine_new(void) { const size_t stack_size = 1 << 20; CoroutineUContext *co; @@ -185,20 +165,6 @@ static Coroutine *coroutine_new(void) return &co->base; } -Coroutine *qemu_coroutine_new(void) -{ - Coroutine *co; - - co = QSLIST_FIRST(&pool); - if (co) { - QSLIST_REMOVE_HEAD(&pool, pool_next); - pool_size--; - } else { - co = coroutine_new(); - } - return co; -} - #ifdef CONFIG_VALGRIND_H #ifdef CONFIG_PRAGMA_DISABLE_UNUSED_BUT_SET /* Work around an unused variable in the valgrind.h macro... */ @@ -217,13 +183,6 @@ void qemu_coroutine_delete(Coroutine *co_) { CoroutineUContext *co = DO_UPCAST(CoroutineUContext, base, co_); - if (pool_size < POOL_MAX_SIZE) { - QSLIST_INSERT_HEAD(&pool, &co->base, pool_next); - co->base.caller = NULL; - pool_size++; - return; - } - #ifdef CONFIG_VALGRIND_H valgrind_stack_deregister(co); #endif diff --git a/qemu-coroutine.c b/qemu-coroutine.c index 600be26..5a86837 100644 --- a/qemu-coroutine.c +++ b/qemu-coroutine.c @@ -17,9 +17,26 @@ #include "qemu-coroutine.h" #include "qemu-coroutine-int.h" +enum { + /* Maximum free pool size prevents holding too many freed coroutines */ + POOL_MAX_SIZE = 64, +}; + +/** Free list to speed up creation */ +static QSLIST_HEAD(, Coroutine) pool = QSLIST_HEAD_INITIALIZER(pool); +static unsigned int pool_size; + Coroutine *qemu_coroutine_create(CoroutineEntry *entry) { - Coroutine *co = qemu_coroutine_new(); + Coroutine *co; + + co = QSLIST_FIRST(&pool); + if (co) { + QSLIST_REMOVE_HEAD(&pool, pool_next); + pool_size--; + } else { + co = qemu_coroutine_new(); + } co->entry = entry; return co; } @@ -35,13 +52,30 @@ static void coroutine_swap(Coroutine *from, Coroutine *to) return; case COROUTINE_TERMINATE: trace_qemu_coroutine_terminate(to); - qemu_coroutine_delete(to); + + if (pool_size < POOL_MAX_SIZE) { + QSLIST_INSERT_HEAD(&pool, to, pool_next); + to->caller = NULL; + pool_size++; + } else { + qemu_coroutine_delete(to); + } return; default: abort(); } } +static void __attribute__((destructor)) coroutine_cleanup(void) +{ + Coroutine *co; + Coroutine *tmp; + + QSLIST_FOREACH_SAFE(co, &pool, pool_next, tmp) { + qemu_coroutine_delete(co); + } +} + void qemu_coroutine_enter(Coroutine *co, void *opaque) { Coroutine *self = qemu_coroutine_self();