Re: [PATCH 2/4] KVM: VMX: Introduce vmx_msr_bitmap_l01_changed() helper

From: Maxim Levitsky
Date: Sun Sep 12 2021 - 11:58:44 EST


On Fri, 2021-09-10 at 18:06 +0200, Vitaly Kuznetsov wrote:
> 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: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx>
> ---
> arch/x86/kvm/vmx/vmx.c | 17 +++++++++++++----
> 1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index ae470afcb699..ad33032e8588 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -3725,6 +3725,17 @@ static void vmx_set_msr_bitmap_write(ulong *msr_bitmap, u32 msr)
> __set_bit(msr & 0x1fff, msr_bitmap + 0xc00 / f);
> }
>
> +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)
> {
> struct vcpu_vmx *vmx = to_vmx(vcpu);
> @@ -3733,8 +3744,7 @@ void vmx_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
> if (!cpu_has_vmx_msr_bitmap())
> return;
>
> - if (static_branch_unlikely(&enable_evmcs))
> - evmcs_touch_msr_bitmap();
> + vmx_msr_bitmap_l01_changed(vmx);
>
> /*
> * Mark the desired intercept state in shadow bitmap, this is needed
> @@ -3778,8 +3788,7 @@ void vmx_enable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
> if (!cpu_has_vmx_msr_bitmap())
> return;
>
> - if (static_branch_unlikely(&enable_evmcs))
> - evmcs_touch_msr_bitmap();
> + vmx_msr_bitmap_l01_changed(vmx);
>
> /*
> * Mark the desired intercept state in shadow bitmap, this is needed
Reviewed-by: Maxim Levitsky <mlevitsk@xxxxxxxxxx>

Best regards,
Maxim Levitsky