On Mon, Dec 12, 2022 at 10:23 PM Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > > Set ENABLE_USR_WAIT_PAUSE in KVM's supported VMX MSR configuration if the > feature is supported in hardware and enabled in KVM's base, non-nested > configuration, i.e. expose ENABLE_USR_WAIT_PAUSE to L1 if it's supported. > This fixes a bug where saving/restoring, i.e. migrating, a vCPU will fail > if WAITPKG (the associated CPUID feature) is enabled for the vCPU, and > obviously allows L1 to enable the feature for L2. > > KVM already effectively exposes ENABLE_USR_WAIT_PAUSE to L1 by stuffing > the allowed-1 control ina vCPU's virtual MSR_IA32_VMX_PROCBASED_CTLS2 when > updating secondary controls in response to KVM_SET_CPUID(2), but (a) that > depends on flawed code (KVM shouldn't touch VMX MSRs in response to CPUID > updates) and (b) runs afoul of vmx_restore_control_msr()'s restriction > that the guest value must be a strict subset of the supported host value. > > Although no past commit explicitly enabled nested support for WAITPKG, > doing so is safe and functionally correct from an architectural > perspective as no additional KVM support is needed to virtualize TPAUSE, > UMONITOR, and UMWAIT for L2 relative to L1, and KVM already forwards > VM-Exits to L1 as necessary (commit bf653b78f960, "KVM: vmx: Introduce > handle_unexpected_vmexit and handle WAITPKG vmexit"). > > Note, KVM always keeps the hosts MSR_IA32_UMWAIT_CONTROL resident in > hardware, i.e. always runs both L1 and L2 with the host's power management > settings for TPAUSE and UMWAIT. See commit bf09fb6cba4f ("KVM: VMX: Stop > context switching MSR_IA32_UMWAIT_CONTROL") for more details. > > Fixes: e69e72faa3a0 ("KVM: x86: Add support for user wait instructions") > Cc: stable@xxxxxxxxxxxxxxx > Reported-by: Aaron Lewis <aaronlewis@xxxxxxxxxx> > Reported-by: Yu Zhang <yu.c.zhang@xxxxxxxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Reviewed-by: Jim Mattson <jmattson@xxxxxxxxxx>