lkml.org 
[lkml]   [2020]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/10] KVM: VMX: Move nested EPT out of kvm_x86_ops.get_tdp_level() hook
    Date
    Separate the "core" TDP level handling from the nested EPT path to make
    it clear that kvm_x86_ops.get_tdp_level() is used if and only if nested
    EPT is not in use (kvm_init_shadow_ept_mmu() calculates the level from
    the passed in vmcs12->eptp). Add a WARN_ON() to enforce that the
    kvm_x86_ops hook is not called for nested EPT.

    This sets the stage for snapshotting the non-"nested EPT" TDP page level
    during kvm_cpuid_update() to avoid the retpoline associated with
    kvm_x86_ops.get_tdp_level() when resetting the MMU, a relatively
    frequent operation when running a nested guest.

    No functional change intended.

    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    ---
    arch/x86/kvm/vmx/vmx.c | 16 ++++++++++++----
    1 file changed, 12 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
    index d826ac541eed..c9c6e72e9660 100644
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -3006,15 +3006,23 @@ void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
    vmx->emulation_required = emulation_required(vcpu);
    }

    -static int get_ept_level(struct kvm_vcpu *vcpu)
    +static int vmx_get_tdp_level(struct kvm_vcpu *vcpu)
    {
    - if (is_guest_mode(vcpu) && nested_cpu_has_ept(get_vmcs12(vcpu)))
    - return vmx_eptp_page_walk_level(nested_ept_get_eptp(vcpu));
    + WARN_ON(is_guest_mode(vcpu) && nested_cpu_has_ept(get_vmcs12(vcpu)));
    +
    if (cpu_has_vmx_ept_5levels() && (cpuid_maxphyaddr(vcpu) > 48))
    return 5;
    return 4;
    }

    +static int get_ept_level(struct kvm_vcpu *vcpu)
    +{
    + if (is_guest_mode(vcpu) && nested_cpu_has_ept(get_vmcs12(vcpu)))
    + return vmx_eptp_page_walk_level(nested_ept_get_eptp(vcpu));
    +
    + return vmx_get_tdp_level(vcpu);
    +}
    +
    u64 construct_eptp(struct kvm_vcpu *vcpu, unsigned long root_hpa)
    {
    u64 eptp = VMX_EPTP_MT_WB;
    @@ -7832,7 +7840,7 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {

    .set_tss_addr = vmx_set_tss_addr,
    .set_identity_map_addr = vmx_set_identity_map_addr,
    - .get_tdp_level = get_ept_level,
    + .get_tdp_level = vmx_get_tdp_level,
    .get_mt_mask = vmx_get_mt_mask,

    .get_exit_info = vmx_get_exit_info,
    --
    2.26.0
    \
     
     \ /
      Last update: 2020-05-02 06:33    [W:3.811 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site