mirror of
https://git.proxmox.com/git/pve-qemu
synced 2025-08-18 03:14:42 +00:00

As reported in the community forum [0][1], QEMU processes for Linux guests would consume more CPU on the host after an update to QEMU 9.2. The issue was reproduced and bisecting pointed to QEMU commit f0ccf77078 ("hpet: fix and cleanup persistence of interrupt status"). Some quick experimentation suggests that in particular the last part is responsible for the issue: > - the timer must be kept running even if not enabled, in > order to set the ISR flag, so writes to HPET_TN_CFG must > not call hpet_del_timer() Users confirmed that setting the hpet=off machine flag works around the issue[0]. For Windows (7 or later) guests, the flag is already disabled, because of issues in the past [2]. Upstream suggested reverting the relevant patches for now [3], because other issues were reported too. All except commit 5895879aca ("hpet: remove unnecessary variable "index"") are actually dependent on each other for cleanly reverting f0ccf77078, and while not strictly required, that one was reverted too for completeness. [0]: https://forum.proxmox.com/threads/163694/ [1]: https://forum.proxmox.com/threads/161849/post-756793 [2]: https://lists.proxmox.com/pipermail/pve-devel/2012-December/004958.html [3]: https://lore.kernel.org/qemu-devel/CABgObfaKJ5NFVKmYLFmu4C0iZZLJJtcWksLCzyA0tBoz0koZ4A@mail.gmail.com/ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
41 lines
1.8 KiB
Diff
41 lines
1.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Fiona Ebner <f.ebner@proxmox.com>
|
|
Date: Wed, 19 Mar 2025 17:31:12 +0100
|
|
Subject: [PATCH] Revert "hpet: ignore high bits of comparator in 32-bit mode"
|
|
|
|
This reverts commit 9eb7fad3546a89ee7cf0e90f5b1daccf89725cea.
|
|
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
---
|
|
hw/timer/hpet.c | 4 ----
|
|
hw/timer/trace-events | 1 -
|
|
2 files changed, 5 deletions(-)
|
|
|
|
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
|
|
index 6f83d88516..509986c0a9 100644
|
|
--- a/hw/timer/hpet.c
|
|
+++ b/hw/timer/hpet.c
|
|
@@ -585,10 +585,6 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
|
|
}
|
|
break;
|
|
case HPET_TN_CMP + 4: // comparator register high order
|
|
- if (timer->config & HPET_TN_32BIT) {
|
|
- trace_hpet_ram_write_invalid_tn_cmp();
|
|
- break;
|
|
- }
|
|
trace_hpet_ram_write_tn_cmp(4);
|
|
if (!timer_is_periodic(timer)
|
|
|| (timer->config & HPET_TN_SETVAL)) {
|
|
diff --git a/hw/timer/trace-events b/hw/timer/trace-events
|
|
index 219747df2f..b86870fb22 100644
|
|
--- a/hw/timer/trace-events
|
|
+++ b/hw/timer/trace-events
|
|
@@ -117,7 +117,6 @@ hpet_ram_write_timer_id(uint64_t timer_id) "hpet_ram_writel timer_id = 0x%" PRIx
|
|
hpet_ram_write_tn_cfg(void) "hpet_ram_writel HPET_TN_CFG"
|
|
hpet_ram_write_invalid_tn_cfg(uint8_t reg_off) "invalid HPET_TN_CFG + %" PRIu8 " write"
|
|
hpet_ram_write_tn_cmp(uint8_t reg_off) "hpet_ram_writel HPET_TN_CMP + %" PRIu8
|
|
-hpet_ram_write_invalid_tn_cmp(void) "invalid HPET_TN_CMP + 4 write"
|
|
hpet_ram_write_invalid(void) "invalid hpet_ram_writel"
|
|
hpet_ram_write_counter_write_while_enabled(void) "Writing counter while HPET enabled!"
|
|
hpet_ram_write_counter_written(uint8_t reg_off, uint64_t value, uint64_t counter) "HPET counter + %" PRIu8 "written. crt = 0x%" PRIx64 " -> 0x%" PRIx64
|