]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: SVM: Skip OSVW MSR reads if KVM is treating all errata as present
authorSean Christopherson <seanjc@google.com>
Thu, 13 Nov 2025 23:14:17 +0000 (15:14 -0800)
committerSean Christopherson <seanjc@google.com>
Tue, 3 Mar 2026 20:23:26 +0000 (12:23 -0800)
Don't bother reading the OSVW MSRs if osvw_len is already zero, i.e. if
KVM is already treating all errata as present, in which case the positive
path of the if-statement is one giant nop.

Opportunistically update the comment to more thoroughly explain how the
MSRs work and why the code does what it does.

Link: https://patch.msgid.link/20251113231420.1695919-3-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/svm.c

index 9d611bfbcc8c2c5872b6e3b4bc4d32e48fe4e834..695cebf8d72415ba9a17957b2bfea7ab580e4f00 100644 (file)
@@ -543,15 +543,25 @@ static int svm_enable_virtualization_cpu(void)
 
 
        /*
-        * Get OSVW bits.
+        * Get OS-Visible Workarounds (OSVW) bits.
         *
         * Note that it is possible to have a system with mixed processor
         * revisions and therefore different OSVW bits. If bits are not the same
         * on different processors then choose the worst case (i.e. if erratum
         * is present on one processor and not on another then assume that the
         * erratum is present everywhere).
+        *
+        * Note #2!  The OSVW MSRs are used to communciate that an erratum is
+        * NOT present!  Software must assume erratum as present if its bit is
+        * set in OSVW_STATUS *or* the bit number exceeds OSVW_ID_LENGTH.  If
+        * either RDMSR fails, simply zero out the length to treat all errata
+        * as being present.  Similarly, use the *minimum* length across all
+        * CPUs, not the maximum length.
+        *
+        * If the length is zero, then is KVM already treating all errata as
+        * being present and there's nothing left to do.
         */
-       if (cpu_has(&boot_cpu_data, X86_FEATURE_OSVW)) {
+       if (osvw_len && cpu_has(&boot_cpu_data, X86_FEATURE_OSVW)) {
                u64 len, status = 0;
                int err;