lkml.org 
[lkml]   [2021]   [Feb]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 4/4] KVM: arm64: Distinguish cases of memcache allocations completely
    Date
    With a guest translation fault, the memcache pages are not needed if KVM
    is only about to install a new leaf entry into the existing page table.
    And with a guest permission fault, the memcache pages are also not needed
    for a write_fault in dirty-logging time if KVM is only about to update
    the existing leaf entry instead of collapsing a block entry into a table.

    By comparing fault_granule and vma_pagesize, cases that require allocations
    from memcache and cases that don't can be distinguished completely.

    Signed-off-by: Yanan Wang <wangyanan55@huawei.com>
    ---
    arch/arm64/kvm/mmu.c | 25 ++++++++++++-------------
    1 file changed, 12 insertions(+), 13 deletions(-)

    diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
    index d151927a7d62..550498a9104e 100644
    --- a/arch/arm64/kvm/mmu.c
    +++ b/arch/arm64/kvm/mmu.c
    @@ -815,19 +815,6 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
    gfn = fault_ipa >> PAGE_SHIFT;
    mmap_read_unlock(current->mm);

    - /*
    - * Permission faults just need to update the existing leaf entry,
    - * and so normally don't require allocations from the memcache. The
    - * only exception to this is when dirty logging is enabled at runtime
    - * and a write fault needs to collapse a block entry into a table.
    - */
    - if (fault_status != FSC_PERM || (logging_active && write_fault)) {
    - ret = kvm_mmu_topup_memory_cache(memcache,
    - kvm_mmu_cache_min_pages(kvm));
    - if (ret)
    - return ret;
    - }
    -
    mmu_seq = vcpu->kvm->mmu_notifier_seq;
    /*
    * Ensure the read of mmu_notifier_seq happens before we call
    @@ -887,6 +874,18 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
    else if (cpus_have_const_cap(ARM64_HAS_CACHE_DIC))
    prot |= KVM_PGTABLE_PROT_X;

    + /*
    + * Allocations from the memcache are required only when granule of the
    + * lookup level where the guest fault happened exceeds vma_pagesize,
    + * which means new page tables will be created in the fault handlers.
    + */
    + if (fault_granule > vma_pagesize) {
    + ret = kvm_mmu_topup_memory_cache(memcache,
    + kvm_mmu_cache_min_pages(kvm));
    + if (ret)
    + return ret;
    + }
    +
    /*
    * Under the premise of getting a FSC_PERM fault, we just need to relax
    * permissions only if vma_pagesize equals fault_granule. Otherwise,
    --
    2.23.0
    \
     
     \ /
      Last update: 2021-02-08 12:45    [W:4.362 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site