]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: SVM: Disable (x2)AVIC IPI virtualization if CPU has erratum #1235
authorMaxim Levitsky <mlevitsk@redhat.com>
Wed, 11 Jun 2025 22:45:21 +0000 (15:45 -0700)
committerSean Christopherson <seanjc@google.com>
Mon, 23 Jun 2025 15:42:22 +0000 (08:42 -0700)
Disable IPI virtualization on AMD Family 17h CPUs (Zen2 and Zen1), as
hardware doesn't reliably detect changes to the 'IsRunning' bit during ICR
write emulation, and might fail to VM-Exit on the sending vCPU, if
IsRunning was recently cleared.

The absence of the VM-Exit leads to KVM not waking (or triggering nested
VM-Exit of) the target vCPU(s) of the IPI, which can lead to hung vCPUs,
unbounded delays in L2 execution, etc.

To workaround the erratum, simply disable IPI virtualization, which
prevents KVM from setting IsRunning and thus eliminates the race where
hardware sees a stale IsRunning=1.  As a result, all ICR writes (except
when "Self" shorthand is used) will VM-Exit and therefore be correctly
emulated by KVM.

Disabling IPI virtualization does carry a performance penalty, but
benchmarkng shows that enabling AVIC without IPI virtualization is still
much better than not using AVIC at all, because AVIC still accelerates
posted interrupts and the receiving end of the IPIs.

Note, when virtualizing Self-IPIs, the CPU skips reading the physical ID
table and updates the vIRR directly (because the vCPU is by definition
actively running), i.e. Self-IPI isn't susceptible to the erratum *and*
is still accelerated by hardware.

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
[sean: rebase, massage changelog, disallow user override]
Acked-by: Naveen N Rao (AMD) <naveen@kernel.org>
Link: https://lore.kernel.org/r/20250611224604.313496-20-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/avic.c

index d0b845ab66fe4d45d40f97ca66fb9bfd8ea8a9a7..72b8cab2fbce92631ddc098e47dbe4ab82207471 100644 (file)
@@ -1188,6 +1188,14 @@ bool avic_hardware_setup(void)
        if (x2avic_enabled)
                pr_info("x2AVIC enabled\n");
 
+       /*
+        * Disable IPI virtualization for AMD Family 17h CPUs (Zen1 and Zen2)
+        * due to erratum 1235, which results in missed VM-Exits on the sender
+        * and thus missed wake events for blocking vCPUs due to the CPU
+        * failing to see a software update to clear IsRunning.
+        */
+       enable_ipiv = enable_ipiv && boot_cpu_data.x86 != 0x17;
+
        amd_iommu_register_ga_log_notifier(&avic_ga_log_notifier);
 
        return true;