Commit 88ea72b4a8 for qemu.org
commit 88ea72b4a89cd4c5853facc4e46dbf125a733b74
Author: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Date: Wed Sep 23 08:15:44 2026 +0200
target/i386: Use an acquire load for interrupt_request()
x86_cpu_has_work() may run without the BQL, but currently reads
CPUState::interrupt_request directly. Other threads update this
field with qatomic_or() in cpu_set_interrupt(), so the direct
read races with an atomic access.
Load the interrupt request with qatomic_load_acquire(), matching
cpu_test_interrupt(). This provides the acquire ordering required
before x86_cpu_pending_interrupt() inspects the CPU state.
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20260923171116.31276-18-philmd@oss.qualcomm.com>
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index b97f144aea..f3bc6911c1 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -10640,7 +10640,9 @@ int x86_cpu_pending_interrupt(const CPUState *cs, int interrupt_request)
static bool x86_cpu_has_work(CPUState *cs)
{
- return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
+ uint32_t pending_interrupts = qatomic_load_acquire(&cs->interrupt_request);
+
+ return x86_cpu_pending_interrupt(cs, pending_interrupts) != 0;
}
#endif /* !CONFIG_USER_ONLY */