mirror of
https://git.proxmox.com/git/pve-qemu
synced 2025-08-24 11:17:51 +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>
69 lines
2.0 KiB
Diff
69 lines
2.0 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:11 +0100
|
|
Subject: [PATCH] Revert "hpet: remove unnecessary variable "index""
|
|
|
|
This reverts commit 5895879aca252f4ebb2d1078eaf836c61ec54e9b.
|
|
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
---
|
|
hw/timer/hpet.c | 15 ++++++++-------
|
|
1 file changed, 8 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
|
|
index b12bbaf10d..6f83d88516 100644
|
|
--- a/hw/timer/hpet.c
|
|
+++ b/hw/timer/hpet.c
|
|
@@ -437,12 +437,12 @@ static uint64_t hpet_ram_read(void *opaque, hwaddr addr,
|
|
unsigned size)
|
|
{
|
|
HPETState *s = opaque;
|
|
- uint64_t cur_tick;
|
|
+ uint64_t cur_tick, index;
|
|
|
|
trace_hpet_ram_read(addr);
|
|
-
|
|
+ index = addr;
|
|
/*address range of all TN regs*/
|
|
- if (addr >= 0x100 && addr <= 0x3ff) {
|
|
+ if (index >= 0x100 && index <= 0x3ff) {
|
|
uint8_t timer_id = (addr - 0x100) / 0x20;
|
|
HPETTimer *timer = &s->timer[timer_id];
|
|
|
|
@@ -469,7 +469,7 @@ static uint64_t hpet_ram_read(void *opaque, hwaddr addr,
|
|
break;
|
|
}
|
|
} else {
|
|
- switch (addr) {
|
|
+ switch (index) {
|
|
case HPET_ID:
|
|
return s->capability;
|
|
case HPET_PERIOD:
|
|
@@ -510,14 +510,15 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
|
|
{
|
|
int i;
|
|
HPETState *s = opaque;
|
|
- uint64_t old_val, new_val, val;
|
|
+ uint64_t old_val, new_val, val, index;
|
|
|
|
trace_hpet_ram_write(addr, value);
|
|
+ index = addr;
|
|
old_val = hpet_ram_read(opaque, addr, 4);
|
|
new_val = value;
|
|
|
|
/*address range of all TN regs*/
|
|
- if (addr >= 0x100 && addr <= 0x3ff) {
|
|
+ if (index >= 0x100 && index <= 0x3ff) {
|
|
uint8_t timer_id = (addr - 0x100) / 0x20;
|
|
HPETTimer *timer = &s->timer[timer_id];
|
|
|
|
@@ -619,7 +620,7 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
|
|
}
|
|
return;
|
|
} else {
|
|
- switch (addr) {
|
|
+ switch (index) {
|
|
case HPET_ID:
|
|
return;
|
|
case HPET_CFG:
|