[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Stable-9.1.1 27/32] util/timer: avoid deadlock when shutting down
From: |
Michael Tokarev |
Subject: |
[Stable-9.1.1 27/32] util/timer: avoid deadlock when shutting down |
Date: |
Mon, 7 Oct 2024 22:16:44 +0300 |
From: Alex Bennée <alex.bennee@linaro.org>
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>
(cherry picked from commit bc02be4508d8753d1f6071b77d10f4661587df6f)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
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
- [Stable-9.1.1 19/32] target/arm: Correct ID_AA64ISAR1_EL1 value for neoverse-v1, (continued)
- [Stable-9.1.1 19/32] target/arm: Correct ID_AA64ISAR1_EL1 value for neoverse-v1, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 20/32] target/hppa: Fix random 32-bit linux-user crashes, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 26/32] hw/mips/jazz: fix typo in in-built NIC alias, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 25/32] target/ppc: Fix lxvx/stxvx facility check, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 30/32] hw/sd/sdcard: Fix handling of disabled boot partitions, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 21/32] target/ppc: Fix migration of CPUs with TLB_EMB TLB type, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 23/32] hw/loongarch/virt: Add description for virt machine type, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 22/32] migration/multifd: Fix p->iov leak in multifd-uadk.c, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 32/32] vnc: fix crash when no console attached, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 31/32] testing: bump mips64el cross to bookworm and fix package list, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 27/32] util/timer: avoid deadlock when shutting down,
Michael Tokarev <=
- [Stable-9.1.1 29/32] target/arm: Avoid target_ulong for physical address lookups, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 28/32] block/reqlist: allow adding overlapping requests, Michael Tokarev, 2024/10/07
- [Stable-9.1.1 24/32] tcg: Fix iteration step in 32-bit gvec operation, Michael Tokarev, 2024/10/07