lkml.org 
[lkml]   [2023]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/14] KVM: nVMX: hyper-v: Introduce nested_vmx_evmcs() accessor
    Date
    There's a number of 'vmx->nested.hv_evmcs' accesses in nested.c, introduce
    'nested_vmx_evmcs()' accessor to hide them all in !CONFIG_KVM_HYPERV case.

    No functional change intended.

    Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    ---
    arch/x86/kvm/vmx/hyperv.h | 8 ++++++++
    arch/x86/kvm/vmx/nested.c | 33 ++++++++++++++++++---------------
    2 files changed, 26 insertions(+), 15 deletions(-)

    diff --git a/arch/x86/kvm/vmx/hyperv.h b/arch/x86/kvm/vmx/hyperv.h
    index ba1a95ea72b7..92bde3b75ca0 100644
    --- a/arch/x86/kvm/vmx/hyperv.h
    +++ b/arch/x86/kvm/vmx/hyperv.h
    @@ -29,6 +29,10 @@ static inline bool nested_vmx_is_evmptr12_valid(struct vcpu_vmx *vmx)
    {
    return evmptr_is_valid(vmx->nested.hv_evmcs_vmptr);
    }
    +static inline struct hv_enlightened_vmcs *nested_vmx_evmcs(struct vcpu_vmx *vmx)
    +{
    + return vmx->nested.hv_evmcs;
    +}
    u64 nested_get_evmptr(struct kvm_vcpu *vcpu);
    uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu);
    int nested_enable_evmcs(struct kvm_vcpu *vcpu,
    @@ -40,6 +44,10 @@ void vmx_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu);
    #else
    static inline gpa_t nested_vmx_evmptr12(struct vcpu_vmx *vmx) { return EVMPTR_INVALID; }
    static inline bool nested_vmx_is_evmptr12_valid(struct vcpu_vmx *vmx) { return false; }
    +static inline struct hv_enlightened_vmcs *nested_vmx_evmcs(struct vcpu_vmx *vmx)
    +{
    + return NULL;
    +}
    static inline u64 nested_get_evmptr(struct kvm_vcpu *vcpu) { return EVMPTR_INVALID; }
    static inline void nested_evmcs_filter_control_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) {}
    static inline bool nested_evmcs_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu) { return false; }
    diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
    index b45586588bae..fa04aa38ad52 100644
    --- a/arch/x86/kvm/vmx/nested.c
    +++ b/arch/x86/kvm/vmx/nested.c
    @@ -574,7 +574,6 @@ static inline bool nested_vmx_prepare_msr_bitmap(struct kvm_vcpu *vcpu,
    int msr;
    unsigned long *msr_bitmap_l1;
    unsigned long *msr_bitmap_l0 = vmx->nested.vmcs02.msr_bitmap;
    - struct hv_enlightened_vmcs *evmcs = vmx->nested.hv_evmcs;
    struct kvm_host_map *map = &vmx->nested.msr_bitmap_map;

    /* Nothing to do if the MSR bitmap is not in use. */
    @@ -590,10 +589,13 @@ static inline bool nested_vmx_prepare_msr_bitmap(struct kvm_vcpu *vcpu,
    * - Nested hypervisor (L1) has enabled 'Enlightened MSR Bitmap' feature
    * and tells KVM (L0) there were no changes in MSR bitmap for L2.
    */
    - if (!vmx->nested.force_msr_bitmap_recalc && evmcs &&
    - evmcs->hv_enlightenments_control.msr_bitmap &&
    - evmcs->hv_clean_fields & HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP)
    - return true;
    + if (!vmx->nested.force_msr_bitmap_recalc) {
    + struct hv_enlightened_vmcs *evmcs = nested_vmx_evmcs(vmx);
    +
    + if (evmcs && evmcs->hv_enlightenments_control.msr_bitmap &&
    + evmcs->hv_clean_fields & HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP)
    + return true;
    + }

    if (kvm_vcpu_map(vcpu, gpa_to_gfn(vmcs12->msr_bitmap), map))
    return false;
    @@ -1576,7 +1578,7 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx)
    static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields)
    {
    struct vmcs12 *vmcs12 = vmx->nested.cached_vmcs12;
    - struct hv_enlightened_vmcs *evmcs = vmx->nested.hv_evmcs;
    + struct hv_enlightened_vmcs *evmcs = nested_vmx_evmcs(vmx);
    struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(&vmx->vcpu);

    /* HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE */
    @@ -1820,7 +1822,7 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields
    static void copy_vmcs12_to_enlightened(struct vcpu_vmx *vmx)
    {
    struct vmcs12 *vmcs12 = vmx->nested.cached_vmcs12;
    - struct hv_enlightened_vmcs *evmcs = vmx->nested.hv_evmcs;
    + struct hv_enlightened_vmcs *evmcs = nested_vmx_evmcs(vmx);

    /*
    * Should not be changed by KVM:
    @@ -2404,7 +2406,7 @@ static void prepare_vmcs02_early(struct vcpu_vmx *vmx, struct loaded_vmcs *vmcs0

    static void prepare_vmcs02_rare(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12)
    {
    - struct hv_enlightened_vmcs *hv_evmcs = vmx->nested.hv_evmcs;
    + struct hv_enlightened_vmcs *hv_evmcs = nested_vmx_evmcs(vmx);

    if (!hv_evmcs || !(hv_evmcs->hv_clean_fields &
    HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) {
    @@ -2536,6 +2538,7 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
    enum vm_entry_failure_code *entry_failure_code)
    {
    struct vcpu_vmx *vmx = to_vmx(vcpu);
    + struct hv_enlightened_vmcs *evmcs = nested_vmx_evmcs(vmx);
    bool load_guest_pdptrs_vmcs12 = false;

    if (vmx->nested.dirty_vmcs12 || nested_vmx_is_evmptr12_valid(vmx)) {
    @@ -2543,8 +2546,7 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
    vmx->nested.dirty_vmcs12 = false;

    load_guest_pdptrs_vmcs12 = !nested_vmx_is_evmptr12_valid(vmx) ||
    - !(vmx->nested.hv_evmcs->hv_clean_fields &
    - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1);
    + !(evmcs->hv_clean_fields & HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1);
    }

    if (vmx->nested.nested_run_pending &&
    @@ -2666,8 +2668,7 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
    * here.
    */
    if (nested_vmx_is_evmptr12_valid(vmx))
    - vmx->nested.hv_evmcs->hv_clean_fields |=
    - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
    + evmcs->hv_clean_fields |= HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;

    return 0;
    }
    @@ -3592,7 +3593,9 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch)
    return nested_vmx_failInvalid(vcpu);

    if (nested_vmx_is_evmptr12_valid(vmx)) {
    - copy_enlightened_to_vmcs12(vmx, vmx->nested.hv_evmcs->hv_clean_fields);
    + struct hv_enlightened_vmcs *evmcs = nested_vmx_evmcs(vmx);
    +
    + copy_enlightened_to_vmcs12(vmx, evmcs->hv_clean_fields);
    /* Enlightened VMCS doesn't have launch state */
    vmcs12->launch_state = !launch;
    } else if (enable_shadow_vmcs) {
    @@ -5327,7 +5330,7 @@ static int handle_vmclear(struct kvm_vcpu *vcpu)
    vmptr + offsetof(struct vmcs12,
    launch_state),
    &zero, sizeof(zero));
    - } else if (vmx->nested.hv_evmcs && vmptr == nested_vmx_evmptr12(vmx)) {
    + } else if (nested_vmx_evmcs(vmx) && vmptr == nested_vmx_evmptr12(vmx)) {
    nested_release_evmcs(vcpu);
    }

    @@ -5405,7 +5408,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu)
    return nested_vmx_fail(vcpu, VMXERR_UNSUPPORTED_VMCS_COMPONENT);

    /* Read the field, zero-extended to a u64 value */
    - value = evmcs_read_any(vmx->nested.hv_evmcs, field, offset);
    + value = evmcs_read_any(nested_vmx_evmcs(vmx), field, offset);
    }

    /*
    --
    2.41.0
    \
     
     \ /
      Last update: 2023-10-25 17:30    [W:4.057 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site