lkml.org 
[lkml]   [2018]   [Oct]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 3/9] x86/kvm/mmu.c: add kvm_mmu parameter to kvm_mmu_free_roots()
    Date
    Add an option to specify which MMU root we want to free. This will
    be used when nested and non-nested MMUs for L1 are split.

    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: Sean Christopherson <sean.j.christopherson@intel.com>
    ---
    arch/x86/include/asm/kvm_host.h | 3 ++-
    arch/x86/kvm/mmu.c | 9 +++++----
    arch/x86/kvm/vmx.c | 2 +-
    3 files changed, 8 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index e4a4ea7842d5..ee5ce6b39b20 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -1339,7 +1339,8 @@ void __kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu);
    int kvm_mmu_load(struct kvm_vcpu *vcpu);
    void kvm_mmu_unload(struct kvm_vcpu *vcpu);
    void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu);
    -void kvm_mmu_free_roots(struct kvm_vcpu *vcpu, ulong roots_to_free);
    +void kvm_mmu_free_roots(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
    + ulong roots_to_free);
    gpa_t translate_nested_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access,
    struct x86_exception *exception);
    gpa_t kvm_mmu_gva_to_gpa_read(struct kvm_vcpu *vcpu, gva_t gva,
    diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
    index 5b14dcbd248a..96c753746b3b 100644
    --- a/arch/x86/kvm/mmu.c
    +++ b/arch/x86/kvm/mmu.c
    @@ -3480,11 +3480,11 @@ static void mmu_free_root_page(struct kvm *kvm, hpa_t *root_hpa,
    }

    /* roots_to_free must be some combination of the KVM_MMU_ROOT_* flags */
    -void kvm_mmu_free_roots(struct kvm_vcpu *vcpu, ulong roots_to_free)
    +void kvm_mmu_free_roots(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
    + ulong roots_to_free)
    {
    int i;
    LIST_HEAD(invalid_list);
    - struct kvm_mmu *mmu = vcpu->arch.mmu;
    bool free_active_root = roots_to_free & KVM_MMU_ROOT_CURRENT;

    BUILD_BUG_ON(KVM_MMU_NUM_PREV_ROOTS >= BITS_PER_LONG);
    @@ -4200,7 +4200,8 @@ static void __kvm_mmu_new_cr3(struct kvm_vcpu *vcpu, gpa_t new_cr3,
    bool skip_tlb_flush)
    {
    if (!fast_cr3_switch(vcpu, new_cr3, new_role, skip_tlb_flush))
    - kvm_mmu_free_roots(vcpu, KVM_MMU_ROOT_CURRENT);
    + kvm_mmu_free_roots(vcpu, vcpu->arch.mmu,
    + KVM_MMU_ROOT_CURRENT);
    }

    void kvm_mmu_new_cr3(struct kvm_vcpu *vcpu, gpa_t new_cr3, bool skip_tlb_flush)
    @@ -4981,7 +4982,7 @@ EXPORT_SYMBOL_GPL(kvm_mmu_load);

    void kvm_mmu_unload(struct kvm_vcpu *vcpu)
    {
    - kvm_mmu_free_roots(vcpu, KVM_MMU_ROOTS_ALL);
    + kvm_mmu_free_roots(vcpu, vcpu->arch.mmu, KVM_MMU_ROOTS_ALL);
    WARN_ON(VALID_PAGE(vcpu->arch.mmu->root_hpa));
    }
    EXPORT_SYMBOL_GPL(kvm_mmu_unload);
    diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
    index 44a926ebebf8..5c32b6f18f2a 100644
    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -9121,7 +9121,7 @@ static int handle_invpcid(struct kvm_vcpu *vcpu)
    == operand.pcid)
    roots_to_free |= KVM_MMU_ROOT_PREVIOUS(i);

    - kvm_mmu_free_roots(vcpu, roots_to_free);
    + kvm_mmu_free_roots(vcpu, vcpu->arch.mmu, roots_to_free);
    /*
    * If neither the current cr3 nor any of the prev_roots use the
    * given PCID, then nothing needs to be done here because a
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-10-08 21:30    [W:3.527 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site