From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 29/33] coroutine: add ./configure --disable-coroutine-pool
Date: Fri, 13 Sep 2013 13:50:59 +0200 [thread overview]
Message-ID: <1379073063-14963-30-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1379073063-14963-1-git-send-email-kwolf@redhat.com>
From: Stefan Hajnoczi <stefanha@redhat.com>
The 'gthread' coroutine backend was written before the freelist (aka
pool) existed in qemu-coroutine.c.
This means that every thread is expected to exit when its coroutine
terminates. It is not possible to reuse threads from a pool.
This patch automatically disables the pool when 'gthread' is used. This
allows the 'gthread' backend to work again (for example,
tests/test-coroutine completes successfully instead of hanging).
I considered implementing thread reuse but I don't want quirks like CPU
affinity differences due to coroutine threads being recycled. The
'gthread' backend is a reference backend and it's therefore okay to skip
the pool optimization.
Note this patch also makes it easy to toggle the pool for benchmarking
purposes:
./configure --with-coroutine-backend=ucontext \
--disable-coroutine-pool
Reported-by: Gabriel Kerneis <gabriel@kerneis.info>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Gabriel Kerneis <gabriel@kerneis.info>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
configure | 24 ++++++++++++++++++++++++
qemu-coroutine.c | 34 +++++++++++++++++++---------------
2 files changed, 43 insertions(+), 15 deletions(-)
diff --git a/configure b/configure
index b499028..1b6f68b 100755
--- a/configure
+++ b/configure
@@ -238,6 +238,7 @@ win_sdk="no"
want_tools="yes"
libiscsi=""
coroutine=""
+coroutine_pool=""
seccomp=""
glusterfs=""
glusterfs_discard="no"
@@ -888,6 +889,10 @@ for opt do
;;
--with-coroutine=*) coroutine="$optarg"
;;
+ --disable-coroutine-pool) coroutine_pool="no"
+ ;;
+ --enable-coroutine-pool) coroutine_pool="yes"
+ ;;
--disable-docs) docs="no"
;;
--enable-docs) docs="yes"
@@ -1189,6 +1194,8 @@ echo " --disable-seccomp disable seccomp support"
echo " --enable-seccomp enables seccomp support"
echo " --with-coroutine=BACKEND coroutine backend. Supported options:"
echo " gthread, ucontext, sigaltstack, windows"
+echo " --disable-coroutine-pool disable coroutine freelist (worse performance)"
+echo " --enable-coroutine-pool enable coroutine freelist (better performance)"
echo " --enable-glusterfs enable GlusterFS backend"
echo " --disable-glusterfs disable GlusterFS backend"
echo " --enable-gcov enable test coverage analysis with gcov"
@@ -3362,6 +3369,17 @@ else
esac
fi
+if test "$coroutine_pool" = ""; then
+ if test "$coroutine" = "gthread"; then
+ coroutine_pool=no
+ else
+ coroutine_pool=yes
+ fi
+fi
+if test "$coroutine" = "gthread" -a "$coroutine_pool" = "yes"; then
+ error_exit "'gthread' coroutine backend does not support pool (use --disable-coroutine-pool)"
+fi
+
##########################################
# check if we have open_by_handle_at
@@ -3733,6 +3751,7 @@ echo "build guest agent $guest_agent"
echo "QGA VSS support $guest_agent_with_vss"
echo "seccomp support $seccomp"
echo "coroutine backend $coroutine"
+echo "coroutine pool $coroutine_pool"
echo "GlusterFS support $glusterfs"
echo "virtio-blk-data-plane $virtio_blk_data_plane"
echo "gcov $gcov_tool"
@@ -4092,6 +4111,11 @@ if test "$rbd" = "yes" ; then
fi
echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
+if test "$coroutine_pool" = "yes" ; then
+ echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
+else
+ echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
+fi
if test "$open_by_handle_at" = "yes" ; then
echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
diff --git a/qemu-coroutine.c b/qemu-coroutine.c
index 423430d..4708521 100644
--- a/qemu-coroutine.c
+++ b/qemu-coroutine.c
@@ -30,15 +30,17 @@ static unsigned int pool_size;
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--;
+ Coroutine *co = NULL;
+
+ if (CONFIG_COROUTINE_POOL) {
+ qemu_mutex_lock(&pool_lock);
+ co = QSLIST_FIRST(&pool);
+ if (co) {
+ QSLIST_REMOVE_HEAD(&pool, pool_next);
+ pool_size--;
+ }
+ qemu_mutex_unlock(&pool_lock);
}
- qemu_mutex_unlock(&pool_lock);
if (!co) {
co = qemu_coroutine_new();
@@ -51,15 +53,17 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry)
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++;
+ if (CONFIG_COROUTINE_POOL) {
+ 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);
- return;
}
- qemu_mutex_unlock(&pool_lock);
qemu_coroutine_delete(co);
}
--
1.8.1.4
next prev parent reply other threads:[~2013-09-13 11:51 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-13 11:50 [Qemu-devel] [PULL 00/33] Block patches Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 01/33] qcow2: Pass discard type to qcow2_discard_clusters() Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 02/33] qcow2: Discard VM state in active L1 after creating snapshot Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 03/33] raw-win32.c: Fix incorrect handling behaviour of small block files Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 04/33] block: Image file option amendment Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 05/33] qcow2-cache: Empty cache Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 06/33] qcow2-cluster: Expand zero clusters Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 07/33] qcow2: Save refcount order in BDRVQcowState Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 08/33] qcow2: Implement bdrv_amend_options Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 09/33] qemu-iotest: qcow2 image option amendment Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 10/33] qemu-iotests: add unix socket help program Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 11/33] qemu-iotests: add infrastructure of fd passing via SCM Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 12/33] qemu-iotests: add tests for runtime fd passing via SCM rights Kevin Wolf
2013-09-13 18:30 ` Eric Blake
2013-09-13 11:50 ` [Qemu-devel] [PULL 13/33] qemu-iotests: New test case in 061 Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 14/33] snapshot: new function bdrv_snapshot_find_by_id_and_name() Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 15/33] snapshot: distinguish id and name in snapshot delete Kevin Wolf
2013-09-13 18:42 ` Eric Blake
2013-09-13 11:50 ` [Qemu-devel] [PULL 16/33] qmp: add internal snapshot support in qmp_transaction Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 17/33] qmp: add interface blockdev-snapshot-internal-sync Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 18/33] qmp: add interface blockdev-snapshot-delete-internal-sync Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 19/33] hmp: add interface hmp_snapshot_blkdev_internal Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 20/33] hmp: add interface hmp_snapshot_delete_blkdev_internal Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 21/33] qemu-iotests: add 057 internal snapshot for block device test case Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 22/33] bdrv: Use "Error" for opening images Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 23/33] bdrv: Use "Error" for creating images Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 24/33] block: Error parameter for open functions Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 25/33] block: Error parameter for create functions Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 26/33] qemu-img create: Emit filename on error Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 27/33] qcow2: Use Error parameter Kevin Wolf
2013-09-13 11:50 ` [Qemu-devel] [PULL 28/33] qemu-iotests: Adjustments due to error propagation Kevin Wolf
2013-09-13 11:50 ` Kevin Wolf [this message]
2013-09-13 11:51 ` [Qemu-devel] [PULL 30/33] qemu-img: fix invalid JSON Kevin Wolf
2013-09-13 11:51 ` [Qemu-devel] [PULL 31/33] qemu-iotests: Cleanup test image in test number 007 Kevin Wolf
2013-09-13 11:51 ` [Qemu-devel] [PULL 32/33] block: Assert validity of BdrvActionOps Kevin Wolf
2013-09-13 11:51 ` [Qemu-devel] [PULL 33/33] qemu-iotests: Fix test 038 Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1379073063-14963-30-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).