KVM: SVM: Skip OSVW MSR reads if KVM is treating all errata as present

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>
This commit is contained in:
Sean Christopherson 2025-11-13 15:14:17 -08:00
parent f35043d0f9
commit 089af84641

View 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;