Commit b84155c3 authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini

KVM: VMX: Introduce vmx_msr_bitmap_l01_changed() helper

In preparation to enabling 'Enlightened MSR Bitmap' feature for Hyper-V
guests move MSR bitmap update tracking to a dedicated helper.

Note: vmx_msr_bitmap_l01_changed() is called when MSR bitmap might be
updated. KVM doesn't check if the bit we're trying to set is already set
(or the bit it's trying to clear is already cleared). Such situations
should not be common and a few false positives should not be a problem.

No functional change intended.
Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
Message-Id: <20211129094704.326635-3-vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 93b350f8
...@@ -3688,6 +3688,17 @@ void free_vpid(int vpid) ...@@ -3688,6 +3688,17 @@ void free_vpid(int vpid)
spin_unlock(&vmx_vpid_lock); spin_unlock(&vmx_vpid_lock);
} }
static void vmx_msr_bitmap_l01_changed(struct vcpu_vmx *vmx)
{
/*
* When KVM is a nested hypervisor on top of Hyper-V and uses
* 'Enlightened MSR Bitmap' feature L0 needs to know that MSR
* bitmap has changed.
*/
if (static_branch_unlikely(&enable_evmcs))
evmcs_touch_msr_bitmap();
}
void vmx_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type) void vmx_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
{ {
struct vcpu_vmx *vmx = to_vmx(vcpu); struct vcpu_vmx *vmx = to_vmx(vcpu);
...@@ -3696,8 +3707,7 @@ void vmx_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type) ...@@ -3696,8 +3707,7 @@ void vmx_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
if (!cpu_has_vmx_msr_bitmap()) if (!cpu_has_vmx_msr_bitmap())
return; return;
if (static_branch_unlikely(&enable_evmcs)) vmx_msr_bitmap_l01_changed(vmx);
evmcs_touch_msr_bitmap();
/* /*
* Mark the desired intercept state in shadow bitmap, this is needed * Mark the desired intercept state in shadow bitmap, this is needed
...@@ -3741,8 +3751,7 @@ void vmx_enable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type) ...@@ -3741,8 +3751,7 @@ void vmx_enable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
if (!cpu_has_vmx_msr_bitmap()) if (!cpu_has_vmx_msr_bitmap())
return; return;
if (static_branch_unlikely(&enable_evmcs)) vmx_msr_bitmap_l01_changed(vmx);
evmcs_touch_msr_bitmap();
/* /*
* Mark the desired intercept state in shadow bitmap, this is needed * Mark the desired intercept state in shadow bitmap, this is needed
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment