[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v3 31/38] coroutine: try harder not to delete corouti
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v3 31/38] coroutine: try harder not to delete coroutines |
Date: |
Tue, 13 Jan 2015 13:48:09 +0000 |
From: Peter Lieven <address@hidden>
Placing coroutines on the global pool should be preferrable, because it
can help all threads. But if the global pool is full, we can still
try to save some allocations by stashing completed coroutines on the
local pool. This is quite cheap too, because it does not require
atomic operations, and provides a gain of 15% in the best case.
Signed-off-by: Peter Lieven <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
Message-id: address@hidden
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
qemu-coroutine.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/qemu-coroutine.c b/qemu-coroutine.c
index da1b961..525247b 100644
--- a/qemu-coroutine.c
+++ b/qemu-coroutine.c
@@ -27,6 +27,7 @@ enum {
static QSLIST_HEAD(, Coroutine) release_pool = QSLIST_HEAD_INITIALIZER(pool);
static unsigned int release_pool_size;
static __thread QSLIST_HEAD(, Coroutine) alloc_pool =
QSLIST_HEAD_INITIALIZER(pool);
+static __thread unsigned int alloc_pool_size;
static __thread Notifier coroutine_pool_cleanup_notifier;
static void coroutine_pool_cleanup(Notifier *n, void *value)
@@ -58,13 +59,14 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry)
* release_pool_size and the actual size of release_pool. But
* it is just a heuristic, it does not need to be perfect.
*/
- release_pool_size = 0;
+ alloc_pool_size = atomic_xchg(&release_pool_size, 0);
QSLIST_MOVE_ATOMIC(&alloc_pool, &release_pool);
co = QSLIST_FIRST(&alloc_pool);
}
}
if (co) {
QSLIST_REMOVE_HEAD(&alloc_pool, pool_next);
+ alloc_pool_size--;
}
}
@@ -87,6 +89,11 @@ static void coroutine_delete(Coroutine *co)
atomic_inc(&release_pool_size);
return;
}
+ if (alloc_pool_size < POOL_BATCH_SIZE) {
+ QSLIST_INSERT_HEAD(&alloc_pool, co, pool_next);
+ alloc_pool_size++;
+ return;
+ }
}
qemu_coroutine_delete(co);
--
2.1.0
- [Qemu-devel] [PULL v3 20/38] libqos: Convert malloc-pc allocator to a generic allocator, (continued)
- [Qemu-devel] [PULL v3 20/38] libqos: Convert malloc-pc allocator to a generic allocator, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 25/38] coroutine-ucontext: use __thread, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 24/38] qemu-iotests: Add supported os parameter for python tests, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 26/38] qemu-thread: add per-thread atexit functions, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 29/38] coroutine: rewrite pool to avoid mutex, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 30/38] coroutine: drop qemu_coroutine_adjust_pool_size, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 27/38] test-coroutine: avoid overflow on 32-bit systems, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 28/38] QSLIST: add lock-free operations, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 32/38] block: limited request size in write zeroes unsupported path, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 33/38] block: Split BLOCK_OP_TYPE_COMMIT to BLOCK_OP_TYPE_COMMIT_{SOURCE, TARGET}, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 31/38] coroutine: try harder not to delete coroutines,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v3 34/38] ide: Implement VPD response for ATAPI, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 35/38] nvme: Fix get/set number of queues feature, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 38/38] NVMe: Set correct VS Value for 1.1 Compliant Controllers, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 36/38] MAINTAINERS: Update email addresses for Chrysostomos Nanakos, Stefan Hajnoczi, 2015/01/13
- [Qemu-devel] [PULL v3 37/38] MAINTAINERS: Add migration/block* to block subsystem, Stefan Hajnoczi, 2015/01/13
- Re: [Qemu-devel] [PULL v3 00/38] Block patches, Peter Maydell, 2015/01/13