KVM: nSVM: Use KVM-governed feature framework to track "Pause Filter enabled"
authorSean Christopherson <seanjc@google.com>
Tue, 15 Aug 2023 20:36:50 +0000 (13:36 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 17 Aug 2023 18:43:30 +0000 (11:43 -0700)
Track "Pause Filtering is exposed to L1" via governed feature flags
instead of using dedicated bits/flags in vcpu_svm.

No functional change intended.

Reviewed-by: Yuan Yao <yuan.yao@intel.com>
Link: https://lore.kernel.org/r/20230815203653.519297-13-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/governed_features.h
arch/x86/kvm/svm/nested.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/svm/svm.h

index 3a4c0e40e1e0a748f0903da2b39bf0f9c4e6e84d..9afd34f30599e646ce9f70812c7b300db077ffe7 100644 (file)
@@ -12,6 +12,8 @@ KVM_GOVERNED_X86_FEATURE(NRIPS)
 KVM_GOVERNED_X86_FEATURE(TSCRATEMSR)
 KVM_GOVERNED_X86_FEATURE(V_VMSAVE_VMLOAD)
 KVM_GOVERNED_X86_FEATURE(LBRV)
+KVM_GOVERNED_X86_FEATURE(PAUSEFILTER)
+KVM_GOVERNED_X86_FEATURE(PFTHRESHOLD)
 
 #undef KVM_GOVERNED_X86_FEATURE
 #undef KVM_GOVERNED_FEATURE
index f50f74b1a04edc34ae52d1ef1b32b8b8158ea5f5..ac03b2bc5b2c64663ae84c2408744e62b645e8d7 100644 (file)
@@ -743,8 +743,14 @@ static void nested_vmcb02_prepare_control(struct vcpu_svm *svm,
        if (!nested_vmcb_needs_vls_intercept(svm))
                vmcb02->control.virt_ext |= VIRTUAL_VMLOAD_VMSAVE_ENABLE_MASK;
 
-       pause_count12 = svm->pause_filter_enabled ? svm->nested.ctl.pause_filter_count : 0;
-       pause_thresh12 = svm->pause_threshold_enabled ? svm->nested.ctl.pause_filter_thresh : 0;
+       if (guest_can_use(vcpu, X86_FEATURE_PAUSEFILTER))
+               pause_count12 = svm->nested.ctl.pause_filter_count;
+       else
+               pause_count12 = 0;
+       if (guest_can_use(vcpu, X86_FEATURE_PFTHRESHOLD))
+               pause_thresh12 = svm->nested.ctl.pause_filter_thresh;
+       else
+               pause_thresh12 = 0;
        if (kvm_pause_in_guest(svm->vcpu.kvm)) {
                /* use guest values since host doesn't intercept PAUSE */
                vmcb02->control.pause_filter_count = pause_count12;
index 3b8e412238d34ee603c5f4150046d0530afdb3b8..0dc70ad88d29a592b43b003d6b0f4c6ecf389df8 100644 (file)
@@ -4271,11 +4271,8 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
        if (!guest_cpuid_is_intel(vcpu))
                kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_V_VMSAVE_VMLOAD);
 
-       svm->pause_filter_enabled = kvm_cpu_cap_has(X86_FEATURE_PAUSEFILTER) &&
-                       guest_cpuid_has(vcpu, X86_FEATURE_PAUSEFILTER);
-
-       svm->pause_threshold_enabled = kvm_cpu_cap_has(X86_FEATURE_PFTHRESHOLD) &&
-                       guest_cpuid_has(vcpu, X86_FEATURE_PFTHRESHOLD);
+       kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_PAUSEFILTER);
+       kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_PFTHRESHOLD);
 
        svm->vgif_enabled = vgif && guest_cpuid_has(vcpu, X86_FEATURE_VGIF);
 
index 0e21823e8a1953f27336292b25bc684f8f02d62e..fb438439b61e522c08694a1f45aa3f1d5c0b7cdd 100644 (file)
@@ -259,8 +259,6 @@ struct vcpu_svm {
        bool soft_int_injected;
 
        /* optional nested SVM features that are enabled for this guest  */
-       bool pause_filter_enabled         : 1;
-       bool pause_threshold_enabled      : 1;
        bool vgif_enabled                 : 1;
        bool vnmi_enabled                 : 1;