diff options
| author | Sean Christopherson <[email protected]> | 2025-06-10 22:57:36 +0000 |
|---|---|---|
| committer | Sean Christopherson <[email protected]> | 2025-06-20 20:07:37 +0000 |
| commit | bea44d1992401b5e1a0d213cba85f9c53f492e8a (patch) | |
| tree | d96658b57077bda66ebf0ed40b795fc9d40cfb8f | |
| parent | KVM: SVM: Add a helper to allocate and initialize permissions bitmaps (diff) | |
| download | kernel-bea44d1992401b5e1a0d213cba85f9c53f492e8a.tar.gz kernel-bea44d1992401b5e1a0d213cba85f9c53f492e8a.zip | |
KVM: x86: Simplify userspace filter logic when disabling MSR interception
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 <[email protected]>
Reviewed-by: Dapeng Mi <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Sean Christopherson <[email protected]>
| -rw-r--r-- | arch/x86/kvm/svm/svm.c | 24 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx/vmx.c | 24 |
2 files changed, 20 insertions, 28 deletions
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index b855b94c3aba..3c5e82ed6bd4 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -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; } diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index e38f4648e612..e2de4748d662 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -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) |
