lkml.org 
[lkml]   [2012]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 4/5] KVM: MMU: introduce page_fault_start and page_fault_end
    Wrap the common operations into these two functions

    Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
    ---
    arch/x86/kvm/mmu.c | 53 +++++++++++++++++++++++++++----------------
    arch/x86/kvm/paging_tmpl.h | 16 +++++--------
    2 files changed, 39 insertions(+), 30 deletions(-)

    diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
    index 29ce28b..7e7b8cd 100644
    --- a/arch/x86/kvm/mmu.c
    +++ b/arch/x86/kvm/mmu.c
    @@ -2825,6 +2825,29 @@ exit:
    static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn,
    gva_t gva, pfn_t *pfn, bool write, bool *writable);

    +static bool
    +page_fault_start(struct kvm_vcpu *vcpu, gfn_t *gfnp, pfn_t *pfnp, int *levelp,
    + bool force_pt_level, unsigned long mmu_seq)
    +{
    + spin_lock(&vcpu->kvm->mmu_lock);
    + if (mmu_notifier_retry(vcpu, mmu_seq))
    + return false;
    +
    + kvm_mmu_free_some_pages(vcpu);
    + if (likely(!force_pt_level))
    + transparent_hugepage_adjust(vcpu, gfnp, pfnp, levelp);
    +
    + return true;
    +}
    +
    +static void page_fault_end(struct kvm_vcpu *vcpu, pfn_t pfn)
    +{
    + spin_unlock(&vcpu->kvm->mmu_lock);
    +
    + if (!is_error_pfn(pfn))
    + kvm_release_pfn_clean(pfn);
    +}
    +
    static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code,
    gfn_t gfn, bool prefault)
    {
    @@ -2862,22 +2885,17 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code,
    if (handle_abnormal_pfn(vcpu, v, gfn, pfn, ACC_ALL, &r))
    return r;

    - spin_lock(&vcpu->kvm->mmu_lock);
    - if (mmu_notifier_retry(vcpu, mmu_seq)) {
    + if (!page_fault_start(vcpu, &gfn, &pfn, &level, force_pt_level,
    + mmu_seq)) {
    r = 0;
    - goto out_unlock;
    + goto exit;
    }

    - kvm_mmu_free_some_pages(vcpu);
    - if (likely(!force_pt_level))
    - transparent_hugepage_adjust(vcpu, &gfn, &pfn, &level);
    r = __direct_map(vcpu, v, write, map_writable, level, gfn, pfn,
    prefault);

    -out_unlock:
    - spin_unlock(&vcpu->kvm->mmu_lock);
    - if (!is_error_pfn(pfn))
    - kvm_release_pfn_clean(pfn);
    +exit:
    + page_fault_end(vcpu, pfn);
    return r;
    }

    @@ -3331,22 +3349,17 @@ static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code,
    if (handle_abnormal_pfn(vcpu, 0, gfn, pfn, ACC_ALL, &r))
    return r;

    - spin_lock(&vcpu->kvm->mmu_lock);
    - if (mmu_notifier_retry(vcpu, mmu_seq)) {
    + if (!page_fault_start(vcpu, &gfn, &pfn, &level, force_pt_level,
    + mmu_seq)) {
    r = 0;
    - goto out_unlock;
    + goto exit;
    }

    - kvm_mmu_free_some_pages(vcpu);
    - if (likely(!force_pt_level))
    - transparent_hugepage_adjust(vcpu, &gfn, &pfn, &level);
    r = __direct_map(vcpu, gpa, write, map_writable,
    level, gfn, pfn, prefault);

    -out_unlock:
    - spin_unlock(&vcpu->kvm->mmu_lock);
    - if (!is_error_pfn(pfn))
    - kvm_release_pfn_clean(pfn);
    +exit:
    + page_fault_end(vcpu, pfn);
    return r;
    }

    diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
    index 0adf376..1a738c5 100644
    --- a/arch/x86/kvm/paging_tmpl.h
    +++ b/arch/x86/kvm/paging_tmpl.h
    @@ -624,26 +624,22 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,
    walker.gfn, pfn, walker.pte_access, &r))
    return r;

    - spin_lock(&vcpu->kvm->mmu_lock);
    - if (mmu_notifier_retry(vcpu, mmu_seq)) {
    + if (!page_fault_start(vcpu, &walker.gfn, &pfn, &level,
    + force_pt_level, mmu_seq)) {
    r = 0;
    - goto out_unlock;
    + goto exit;
    }

    kvm_mmu_audit(vcpu, AUDIT_PRE_PAGE_FAULT);
    - kvm_mmu_free_some_pages(vcpu);
    - if (!force_pt_level)
    - transparent_hugepage_adjust(vcpu, &walker.gfn, &pfn, &level);
    +
    r = FNAME(fetch)(vcpu, addr, &walker, user_fault, write_fault,
    level, pfn, map_writable, prefault);

    ++vcpu->stat.pf_fixed;
    kvm_mmu_audit(vcpu, AUDIT_POST_PAGE_FAULT);

    -out_unlock:
    - spin_unlock(&vcpu->kvm->mmu_lock);
    - if (!is_error_pfn(pfn))
    - kvm_release_pfn_clean(pfn);
    +exit:
    + page_fault_end(vcpu, pfn);
    return r;
    }

    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-09-14 12:41    [W:0.037 / U:58.500 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site