diff mbox

[RFC,1/3] Revert "coroutine: make pool size dynamic"

Message ID 1417084026-12307-2-git-send-email-pl@kamp.de
State New
Headers show

Commit Message

Peter Lieven Nov. 27, 2014, 10:27 a.m. UTC
This reverts commit ac2662a913ee5854b1269256adbdc14e57ba480a.
---
 include/block/coroutine.h |   11 -----------
 qemu-coroutine.c          |   26 +++-----------------------
 2 files changed, 3 insertions(+), 34 deletions(-)

Comments

Stefan Hajnoczi Nov. 28, 2014, 12:42 p.m. UTC | #1
On Thu, Nov 27, 2014 at 11:27:04AM +0100, Peter Lieven wrote:
> This reverts commit ac2662a913ee5854b1269256adbdc14e57ba480a.

Justification?

Won't we hit the same problem as the global pool: either pool size is
too large or too small.  If you exceed the pool size performance drops
dramatically.

Stefan
Peter Lieven Nov. 28, 2014, 12:45 p.m. UTC | #2
Am 28.11.2014 um 13:42 schrieb Stefan Hajnoczi:
> On Thu, Nov 27, 2014 at 11:27:04AM +0100, Peter Lieven wrote:
>> This reverts commit ac2662a913ee5854b1269256adbdc14e57ba480a.
> Justification?
>
> Won't we hit the same problem as the global pool: either pool size is
> too large or too small.  If you exceed the pool size performance drops
> dramatically.

Each thread has its own pool. But you can ignore this series I think.
The idea Paolo came up with seems to be better. With
my last improvement it seems to have equal performance without
the drawback of different threads creating and destroying the coroutines.

Peter
diff mbox

Patch

diff --git a/include/block/coroutine.h b/include/block/coroutine.h
index 793df0e..1d9343d 100644
--- a/include/block/coroutine.h
+++ b/include/block/coroutine.h
@@ -215,15 +215,4 @@  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);
-
-/**
- * Add or subtract from the coroutine pool size
- *
- * The coroutine implementation keeps a pool of coroutines to be reused by
- * qemu_coroutine_create().  This makes coroutine creation cheap.  Heavy
- * coroutine users should call this to reserve pool space.  Call it again with
- * a negative number to release pool space.
- */
-void qemu_coroutine_adjust_pool_size(int n);
-
 #endif /* QEMU_COROUTINE_H */
diff --git a/qemu-coroutine.c b/qemu-coroutine.c
index bd574aa..4708521 100644
--- a/qemu-coroutine.c
+++ b/qemu-coroutine.c
@@ -19,14 +19,14 @@ 
 #include "block/coroutine_int.h"
 
 enum {
-    POOL_DEFAULT_SIZE = 64,
+    /* Maximum free pool size prevents holding too many freed coroutines */
+    POOL_MAX_SIZE = 64,
 };
 
 /** Free list to speed up creation */
 static QemuMutex pool_lock;
 static QSLIST_HEAD(, Coroutine) pool = QSLIST_HEAD_INITIALIZER(pool);
 static unsigned int pool_size;
-static unsigned int pool_max_size = POOL_DEFAULT_SIZE;
 
 Coroutine *qemu_coroutine_create(CoroutineEntry *entry)
 {
@@ -55,7 +55,7 @@  static void coroutine_delete(Coroutine *co)
 {
     if (CONFIG_COROUTINE_POOL) {
         qemu_mutex_lock(&pool_lock);
-        if (pool_size < pool_max_size) {
+        if (pool_size < POOL_MAX_SIZE) {
             QSLIST_INSERT_HEAD(&pool, co, pool_next);
             co->caller = NULL;
             pool_size++;
@@ -137,23 +137,3 @@  void coroutine_fn qemu_coroutine_yield(void)
     self->caller = NULL;
     coroutine_swap(self, to);
 }
-
-void qemu_coroutine_adjust_pool_size(int n)
-{
-    qemu_mutex_lock(&pool_lock);
-
-    pool_max_size += n;
-
-    /* Callers should never take away more than they added */
-    assert(pool_max_size >= POOL_DEFAULT_SIZE);
-
-    /* Trim oversized pool down to new max */
-    while (pool_size > pool_max_size) {
-        Coroutine *co = QSLIST_FIRST(&pool);
-        QSLIST_REMOVE_HEAD(&pool, pool_next);
-        pool_size--;
-        qemu_coroutine_delete(co);
-    }
-
-    qemu_mutex_unlock(&pool_lock);
-}