]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: VMX: Ensure vIRR isn't reloaded at odd times when sync'ing PIR
authorSean Christopherson <seanjc@google.com>
Tue, 1 Apr 2025 16:34:42 +0000 (09:34 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 24 Apr 2025 18:19:38 +0000 (11:19 -0700)
Read each vIRR exactly once when shuffling IRQs from the PIR to the vAPIC
to ensure getting the highest priority IRQ from the chunk doesn't reload
from the vIRR.  In practice, a reload is functionally benign as vcpu->mutex
is held and so IRQs can be consumed, i.e. new IRQs can appear, but existing
IRQs can't disappear.

Link: https://lore.kernel.org/r/20250401163447.846608-4-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/lapic.c

index c9de81cc27e1731a5b10a48c6aed896e389e9971..38d793a96686253b31464f38433e02168f930f73 100644 (file)
@@ -667,7 +667,7 @@ bool __kvm_apic_update_irr(u32 *pir, void *regs, int *max_irr)
        for (i = vec = 0; i <= 7; i++, vec += 32) {
                u32 *p_irr = (u32 *)(regs + APIC_IRR + i * 0x10);
 
-               irr_val = *p_irr;
+               irr_val = READ_ONCE(*p_irr);
                pir_val = READ_ONCE(pir[i]);
 
                if (pir_val) {