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 */