]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Simplify userspace filter logic when disabling MSR interception
authorSean Christopherson <seanjc@google.com>
Tue, 10 Jun 2025 22:57:36 +0000 (15:57 -0700)
committerSean Christopherson <seanjc@google.com>
Fri, 20 Jun 2025 20:07:37 +0000 (13:07 -0700)
Refactor {svm,vmx}_disable_intercept_for_msr() to simplify the handling of
userspace filters that disallow access to an MSR.  The more complicated
logic is no longer needed or justified now that KVM recalculates all MSR
intercepts on a userspace MSR filter change, i.e. now that KVM doesn't
need to also update shadow bitmaps.

No functional change intended.

Suggested-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
Link: https://lore.kernel.org/r/20250610225737.156318-32-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c

index b855b94c3aba774a8c68d7d4a9a26f6d4e9be43a..3c5e82ed6bd476427617a4095ba813bcfc286359 100644 (file)
@@ -685,24 +685,20 @@ void svm_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
        void *msrpm = svm->msrpm;
 
        /* Don't disable interception for MSRs userspace wants to handle. */
-       if ((type & MSR_TYPE_R) &&
-           !kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_READ)) {
-               svm_set_msr_bitmap_read(msrpm, msr);
-               type &= ~MSR_TYPE_R;
+       if (type & MSR_TYPE_R) {
+               if (kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_READ))
+                       svm_clear_msr_bitmap_read(msrpm, msr);
+               else
+                       svm_set_msr_bitmap_read(msrpm, msr);
        }
 
-       if ((type & MSR_TYPE_W) &&
-           !kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_WRITE)) {
-               svm_set_msr_bitmap_write(msrpm, msr);
-               type &= ~MSR_TYPE_W;
+       if (type & MSR_TYPE_W) {
+               if (kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_WRITE))
+                       svm_clear_msr_bitmap_write(msrpm, msr);
+               else
+                       svm_set_msr_bitmap_write(msrpm, msr);
        }
 
-       if (type & MSR_TYPE_R)
-               svm_clear_msr_bitmap_read(msrpm, msr);
-
-       if (type & MSR_TYPE_W)
-               svm_clear_msr_bitmap_write(msrpm, msr);
-
        svm_hv_vmcb_dirty_nested_enlightenments(vcpu);
        svm->nested.force_msr_bitmap_recalc = true;
 }
index e38f4648e61292ca860b7ef92b5264416508657c..e2de4748d662ccc2e3104de6410fe4b13e1d8dba 100644 (file)
@@ -3973,23 +3973,19 @@ void vmx_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
 
        vmx_msr_bitmap_l01_changed(vmx);
 
-       if ((type & MSR_TYPE_R) &&
-           !kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_READ)) {
-               vmx_set_msr_bitmap_read(msr_bitmap, msr);
-               type &= ~MSR_TYPE_R;
+       if (type & MSR_TYPE_R) {
+               if (kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_READ))
+                       vmx_clear_msr_bitmap_read(msr_bitmap, msr);
+               else
+                       vmx_set_msr_bitmap_read(msr_bitmap, msr);
        }
 
-       if ((type & MSR_TYPE_W) &&
-           !kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_WRITE)) {
-               vmx_set_msr_bitmap_write(msr_bitmap, msr);
-               type &= ~MSR_TYPE_W;
+       if (type & MSR_TYPE_W) {
+               if (kvm_msr_allowed(vcpu, msr, KVM_MSR_FILTER_WRITE))
+                       vmx_clear_msr_bitmap_write(msr_bitmap, msr);
+               else
+                       vmx_set_msr_bitmap_write(msr_bitmap, msr);
        }
-
-       if (type & MSR_TYPE_R)
-               vmx_clear_msr_bitmap_read(msr_bitmap, msr);
-
-       if (type & MSR_TYPE_W)
-               vmx_clear_msr_bitmap_write(msr_bitmap, msr);
 }
 
 void vmx_enable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)