aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorAnthony PERARD <anthony.perard@citrix.com>2023-07-14 16:27:20 +0100
committerMichael Tokarev <mjt@tls.msk.ru>2023-08-04 19:14:46 +0300
commit157529eee6869aa29201a5fdabeed4e1622e23bb (patch)
tree8086f0c1d56aa8a6d6e24e3762be0d79ffc0d7a0 /util
parent5a87bcee89e233f0b81eb0414867b8fda1011da4 (diff)
downloadqemu-157529eee6869aa29201a5fdabeed4e1622e23bb.zip
qemu-157529eee6869aa29201a5fdabeed4e1622e23bb.tar.gz
qemu-157529eee6869aa29201a5fdabeed4e1622e23bb.tar.bz2
thread-pool: signal "request_cond" while locked
thread_pool_free() might have been called on the `pool`, which would be a reason for worker_thread() to quit. In this case, `pool->request_cond` is been destroyed. If worker_thread() didn't managed to signal `request_cond` before it been destroyed by thread_pool_free(), we got: util/qemu-thread-posix.c:198: qemu_cond_signal: Assertion `cond->initialized' failed. One backtrace: __GI___assert_fail (assertion=0x55555614abcb "cond->initialized", file=0x55555614ab88 "util/qemu-thread-posix.c", line=198, function=0x55555614ad80 <__PRETTY_FUNCTION__.17104> "qemu_cond_signal") at assert.c:101 qemu_cond_signal (cond=0x7fffb800db30) at util/qemu-thread-posix.c:198 worker_thread (opaque=0x7fffb800dab0) at util/thread-pool.c:129 qemu_thread_start (args=0x7fffb8000b20) at util/qemu-thread-posix.c:505 start_thread (arg=<optimized out>) at pthread_create.c:486 Reported here: https://lore.kernel.org/all/ZJwoK50FcnTSfFZ8@MacBook-Air-de-Roger.local/T/#u To avoid issue, keep lock while sending a signal to `request_cond`. Fixes: 900fa208f506 ("thread-pool: replace semaphore with condition variable") Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20230714152720.5077-1-anthony.perard@citrix.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> (cherry picked from commit f4f71363fcdb1092ff64d2bba6f9af39570c2f2b) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Diffstat (limited to 'util')
-rw-r--r--util/thread-pool.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/util/thread-pool.c b/util/thread-pool.c
index 31113b5..39accc9 100644
--- a/util/thread-pool.c
+++ b/util/thread-pool.c
@@ -120,13 +120,13 @@ static void *worker_thread(void *opaque)
pool->cur_threads--;
qemu_cond_signal(&pool->worker_stopped);
- qemu_mutex_unlock(&pool->lock);
/*
* Wake up another thread, in case we got a wakeup but decided
* to exit due to pool->cur_threads > pool->max_threads.
*/
qemu_cond_signal(&pool->request_cond);
+ qemu_mutex_unlock(&pool->lock);
return NULL;
}