[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 14/18] util/timer: avoid deadlock when shutting down
From: |
Alex Bennée |
Subject: |
[PULL 14/18] util/timer: avoid deadlock when shutting down |
Date: |
Wed, 18 Sep 2024 22:07:08 +0100 |
When we shut down a guest we disable the timers. However this can
cause deadlock if the guest has queued some async work that is trying
to advance system time and spins forever trying to wind time forward.
Pay attention to the return code and bail early if we can't wind time
forward.
Reported-by: Elisha Hollander <just4now666666@gmail.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Message-Id: <20240916085400.1046925-15-alex.bennee@linaro.org>
diff --git a/util/qemu-timer.c b/util/qemu-timer.c
index 213114be68..6b1533bc2a 100644
--- a/util/qemu-timer.c
+++ b/util/qemu-timer.c
@@ -685,10 +685,17 @@ int64_t qemu_clock_advance_virtual_time(int64_t dest)
{
int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
AioContext *aio_context;
+ int64_t deadline;
+
aio_context = qemu_get_aio_context();
- while (clock < dest) {
- int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
+
+ deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
QEMU_TIMER_ATTR_ALL);
+ /*
+ * A deadline of < 0 indicates this timer is not enabled, so we
+ * won't get far trying to run it forward.
+ */
+ while (deadline >= 0 && clock < dest) {
int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
qemu_virtual_clock_set_ns(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
warp);
@@ -696,6 +703,9 @@ int64_t qemu_clock_advance_virtual_time(int64_t dest)
qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+
+ deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
+ QEMU_TIMER_ATTR_ALL);
}
qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
--
2.39.5
- [PULL 08/18] tests/tcg/plugins/mem: add option to print memory accesses, (continued)
- [PULL 08/18] tests/tcg/plugins/mem: add option to print memory accesses, Alex Bennée, 2024/09/18
- [PULL 10/18] tests/tcg: clean up output of memory system test, Alex Bennée, 2024/09/18
- [PULL 12/18] tests/tcg: ensure s390x-softmmu output redirected, Alex Bennée, 2024/09/18
- [PULL 09/18] tests/tcg/multiarch: add test for plugin memory access, Alex Bennée, 2024/09/18
- [PULL 11/18] tests/tcg: only read/write 64 bit words on 64 bit systems, Alex Bennée, 2024/09/18
- [PULL 17/18] plugins: add option to dump write argument to syscall plugin, Alex Bennée, 2024/09/18
- [PULL 15/18] contrib/plugins: Add a plugin to generate basic block vectors, Alex Bennée, 2024/09/18
- [PULL 18/18] contrib/plugins: avoid hanging program, Alex Bennée, 2024/09/18
- [PULL 13/18] tests/tcg: add a system test to check memory instrumentation, Alex Bennée, 2024/09/18
- [PULL 16/18] plugins: add plugin API to read guest memory, Alex Bennée, 2024/09/18
- [PULL 14/18] util/timer: avoid deadlock when shutting down,
Alex Bennée <=
- Re: [PULL 00/18] tcg plugins (deprecations, mem apis, contrib plugins), Peter Maydell, 2024/09/19