aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2022-08-09 10:55:14 +0100
committerPeter Maydell <peter.maydell@linaro.org>2022-08-09 10:55:14 +0100
commitc7f26ded6d5065e4116f630f6a490b55f6c5f58e (patch)
treefd61cf34b851f0634b7779c7d9e564f41f8b9069
parentca5f3d4df1b47d7f66a109cdb504e83dfd7ec433 (diff)
icount: Take iothread lock when running QEMU timerspull-target-arm-20220809
The function icount_prepare_for_run() is called with the iothread unlocked, but it can call icount_notify_aio_contexts() which will run qemu timer handlers. Those are supposed to be run only with the iothread lock held, so take the lock while we do that. Since icount mode runs everything on a single thread anyway, not holding the lock is likely mostly not going to introduce races, but it can cause us to trip over assertions that we do hold the lock, such as the one reported in issue 1130. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1130 Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru> Message-id: 20220801164527.3134765-1-peter.maydell@linaro.org
-rw-r--r--accel/tcg/tcg-accel-ops-icount.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/accel/tcg/tcg-accel-ops-icount.c b/accel/tcg/tcg-accel-ops-icount.c
index 8f1dda4344..84cc7421be 100644
--- a/accel/tcg/tcg-accel-ops-icount.c
+++ b/accel/tcg/tcg-accel-ops-icount.c
@@ -109,7 +109,13 @@ void icount_prepare_for_run(CPUState *cpu)
replay_mutex_lock();
if (cpu->icount_budget == 0) {
+ /*
+ * We're called without the iothread lock, so must take it while
+ * we're calling timer handlers.
+ */
+ qemu_mutex_lock_iothread();
icount_notify_aio_contexts();
+ qemu_mutex_unlock_iothread();
}
}