mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-14 12:21:15 -04:00
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 <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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user