lkml.org 
[lkml]   [2023]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v2 02/27] KVM: x86/mmu: Factor out helper to get max mapping size of a memslot
    From
    Extract the memslot-related logic of kvm_mmu_max_mapping_level() into a
    new helper so that KVMGT can determine whether or not mapping a 2MiB page
    into the guest is (dis)allowed per KVM's memslots.

    No functional change intended.

    Signed-off-by: Sean Christopherson <seanjc@google.com>
    ---
    arch/x86/kvm/mmu/mmu.c | 21 +++++++++++++++------
    arch/x86/kvm/mmu/mmu_internal.h | 2 ++
    2 files changed, 17 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
    index c8ebe542c565..4685c80e441b 100644
    --- a/arch/x86/kvm/mmu/mmu.c
    +++ b/arch/x86/kvm/mmu/mmu.c
    @@ -3083,20 +3083,29 @@ static int host_pfn_mapping_level(struct kvm *kvm, gfn_t gfn,
    return level;
    }

    +int kvm_mmu_max_slot_mapping_level(const struct kvm_memory_slot *slot,
    + gfn_t gfn, int max_level)
    +{
    + struct kvm_lpage_info *linfo;
    +
    + for ( ; max_level > PG_LEVEL_4K; max_level--) {
    + linfo = lpage_info_slot(gfn, slot, max_level);
    + if (!linfo->disallow_lpage)
    + break;
    + }
    + return max_level;
    +}
    +
    int kvm_mmu_max_mapping_level(struct kvm *kvm,
    const struct kvm_memory_slot *slot, gfn_t gfn,
    int max_level)
    {
    - struct kvm_lpage_info *linfo;
    int host_level;

    max_level = min(max_level, max_huge_page_level);
    - for ( ; max_level > PG_LEVEL_4K; max_level--) {
    - linfo = lpage_info_slot(gfn, slot, max_level);
    - if (!linfo->disallow_lpage)
    - break;
    - }
    + max_level = kvm_mmu_max_slot_mapping_level(slot, gfn, max_level);

    + /* Avoid walking the host page tables if a hugepage is impossible. */
    if (max_level == PG_LEVEL_4K)
    return PG_LEVEL_4K;

    diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h
    index cc58631e2336..9db7fa0b3bf9 100644
    --- a/arch/x86/kvm/mmu/mmu_internal.h
    +++ b/arch/x86/kvm/mmu/mmu_internal.h
    @@ -328,6 +328,8 @@ static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
    return r;
    }

    +int kvm_mmu_max_slot_mapping_level(const struct kvm_memory_slot *slot,
    + gfn_t gfn, int max_level);
    int kvm_mmu_max_mapping_level(struct kvm *kvm,
    const struct kvm_memory_slot *slot, gfn_t gfn,
    int max_level);
    --
    2.40.0.rc1.284.g88254d51c5-goog
    \
     
     \ /
      Last update: 2023-03-27 00:54    [W:2.060 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site