diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2013-05-24 13:47:25 -0500 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2013-05-24 13:47:25 -0500 |
commit | 4c5dad040bce8f8c9924dc72cfac9380e4ffdc26 (patch) | |
tree | 036ffed1e7ca8bed9042bcaf19f439b1065dbf01 /qemu-coroutine.c | |
parent | 64afc2b4d48fb21e085517c38a59a3f61a11283c (diff) | |
parent | 02ffb504485f0920cfc75a0982a602f824a9a4f4 (diff) | |
download | hqemu-4c5dad040bce8f8c9924dc72cfac9380e4ffdc26.zip hqemu-4c5dad040bce8f8c9924dc72cfac9380e4ffdc26.tar.gz |
Merge remote-tracking branch 'stefanha/block' into staging
# By Wenchao Xia (5) and others
# Via Stefan Hajnoczi
* stefanha/block:
coroutine: stop using AioContext in CoQueue
coroutine: protect global pool with a mutex
qemu-iotests: Try creating huge qcow2 image
qcow2.py: Subcommand for changing header fields
qemu-io: Fix 'map' output
blockdev: Rename BlockdevAction -> TransactionAction
block: make all steps in qmp_transaction() as callback
block: package rollback code in qmp_transaction()
block: package committing code in qmp_transaction()
block: move input parsing code in qmp_transaction()
block: package preparation code in qmp_transaction()
Message-id: 1369405947-14818-1-git-send-email-stefanha@redhat.com
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'qemu-coroutine.c')
-rw-r--r-- | qemu-coroutine.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/qemu-coroutine.c b/qemu-coroutine.c index 25a14c6..423430d 100644 --- a/qemu-coroutine.c +++ b/qemu-coroutine.c @@ -14,6 +14,7 @@ #include "trace.h" #include "qemu-common.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "block/coroutine_int.h" @@ -23,6 +24,7 @@ enum { }; /** Free list to speed up creation */ +static QemuMutex pool_lock; static QSLIST_HEAD(, Coroutine) pool = QSLIST_HEAD_INITIALIZER(pool); static unsigned int pool_size; @@ -30,31 +32,44 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry) { Coroutine *co; + qemu_mutex_lock(&pool_lock); co = QSLIST_FIRST(&pool); if (co) { QSLIST_REMOVE_HEAD(&pool, pool_next); pool_size--; - } else { + } + qemu_mutex_unlock(&pool_lock); + + if (!co) { co = qemu_coroutine_new(); } co->entry = entry; + QTAILQ_INIT(&co->co_queue_wakeup); return co; } static void coroutine_delete(Coroutine *co) { + qemu_mutex_lock(&pool_lock); if (pool_size < POOL_MAX_SIZE) { QSLIST_INSERT_HEAD(&pool, co, pool_next); co->caller = NULL; pool_size++; + qemu_mutex_unlock(&pool_lock); return; } + qemu_mutex_unlock(&pool_lock); qemu_coroutine_delete(co); } -static void __attribute__((destructor)) coroutine_cleanup(void) +static void __attribute__((constructor)) coroutine_pool_init(void) +{ + qemu_mutex_init(&pool_lock); +} + +static void __attribute__((destructor)) coroutine_pool_cleanup(void) { Coroutine *co; Coroutine *tmp; @@ -63,6 +78,8 @@ static void __attribute__((destructor)) coroutine_cleanup(void) QSLIST_REMOVE_HEAD(&pool, pool_next); qemu_coroutine_delete(co); } + + qemu_mutex_destroy(&pool_lock); } static void coroutine_swap(Coroutine *from, Coroutine *to) @@ -71,6 +88,8 @@ static void coroutine_swap(Coroutine *from, Coroutine *to) ret = qemu_coroutine_switch(from, to, COROUTINE_YIELD); + qemu_co_queue_run_restart(to); + switch (ret) { case COROUTINE_YIELD: return; |