[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 15/22] coroutine: move pooling to common code
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 15/22] coroutine: move pooling to common code |
Date: |
Fri, 22 Feb 2013 22:23:44 +0100 |
From: Paolo Bonzini <address@hidden>
The coroutine pool code is duplicated between the ucontext and
sigaltstack backends, and absent from the win32 backend. But the
code can be shared easily by moving it to qemu-coroutine.c.
Signed-off-by: Paolo Bonzini <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
coroutine-sigaltstack.c | 43 +------------------------------------------
coroutine-ucontext.c | 43 +------------------------------------------
qemu-coroutine.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
3 files changed, 45 insertions(+), 86 deletions(-)
diff --git a/coroutine-sigaltstack.c b/coroutine-sigaltstack.c
index e37ebac..b4d1762 100644
--- a/coroutine-sigaltstack.c
+++ b/coroutine-sigaltstack.c
@@ -33,15 +33,6 @@
#include "qemu-common.h"
#include "block/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;
-
typedef struct {
Coroutine base;
void *stack;
@@ -85,17 +76,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;
@@ -164,7 +144,7 @@ static void coroutine_trampoline(int signal)
coroutine_bootstrap(self, co);
}
-static Coroutine *coroutine_new(void)
+Coroutine *qemu_coroutine_new(void)
{
const size_t stack_size = 1 << 20;
CoroutineUContext *co;
@@ -272,31 +252,10 @@ 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;
-}
-
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;
- }
-
g_free(co->stack);
g_free(co);
}
diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c
index a9c30e9..6f8ffa8 100644
--- a/coroutine-ucontext.c
+++ b/coroutine-ucontext.c
@@ -34,15 +34,6 @@
#include <valgrind/valgrind.h>
#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_DIAGNOSTIC_AVAILABLE
/* 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 0f6e268..25a14c6 100644
--- a/qemu-coroutine.c
+++ b/qemu-coroutine.c
@@ -17,13 +17,54 @@
#include "block/coroutine.h"
#include "block/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;
}
+static void coroutine_delete(Coroutine *co)
+{
+ if (pool_size < POOL_MAX_SIZE) {
+ QSLIST_INSERT_HEAD(&pool, co, pool_next);
+ co->caller = NULL;
+ pool_size++;
+ return;
+ }
+
+ qemu_coroutine_delete(co);
+}
+
+static void __attribute__((destructor)) coroutine_cleanup(void)
+{
+ Coroutine *co;
+ Coroutine *tmp;
+
+ QSLIST_FOREACH_SAFE(co, &pool, pool_next, tmp) {
+ QSLIST_REMOVE_HEAD(&pool, pool_next);
+ qemu_coroutine_delete(co);
+ }
+}
+
static void coroutine_swap(Coroutine *from, Coroutine *to)
{
CoroutineAction ret;
@@ -35,7 +76,7 @@ static void coroutine_swap(Coroutine *from, Coroutine *to)
return;
case COROUTINE_TERMINATE:
trace_qemu_coroutine_terminate(to);
- qemu_coroutine_delete(to);
+ coroutine_delete(to);
return;
default:
abort();
--
1.8.1.2
- [Qemu-devel] [PATCH 03/22] qcow2: introduce check_refcounts_l1/l2() flags, (continued)
- [Qemu-devel] [PATCH 03/22] qcow2: introduce check_refcounts_l1/l2() flags, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 04/22] qcow2: record fragmentation statistics during check, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 10/22] block: Add synchronous wrapper for bdrv_co_is_allocated_above, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 07/22] qcow2: support compressed clusters in BlockFragInfo, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 09/22] block: refuse negative iops and bps values, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 08/22] block: use Error in do_check_io_limits(), Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 06/22] qemu-img: add compressed clusters to BlockFragInfo, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 05/22] qemu-img: fix missing space in qemu-img check output, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 12/22] qemu-img: Add compare subcommand, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 11/22] qemu-img: Add "Quiet mode" option, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 15/22] coroutine: move pooling to common code,
Kevin Wolf <=
- [Qemu-devel] [PATCH 13/22] qemu-iotests: Add qemu-img compare test, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 16/22] coroutine: trim down nesting level in perf_nesting test, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 17/22] block: complete all IOs before .bdrv_truncate, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 19/22] blockdev: add discard suboption to -drive, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 18/22] block: implement BDRV_O_UNMAP, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 21/22] blockdev: enable discard by default, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 14/22] qemu-iotests: Test qcow2 image creation options, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 20/22] qemu-nbd: add --discard option, Kevin Wolf, 2013/02/22
- [Qemu-devel] [PATCH 22/22] pc: add compatibility machine types for 1.4, Kevin Wolf, 2013/02/22