lkml.org 
[lkml]   [2016]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/11] KVM: MMU: simplify mmu_need_write_protect
    Date
    Now, all non-leaf shadow page are page tracked, if gfn is not tracked
    there is no non-leaf shadow page of gfn is existed, we can directly
    make the shadow page of gfn to unsync

    Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
    ---
    arch/x86/kvm/mmu.c | 29 +++++++----------------------
    1 file changed, 7 insertions(+), 22 deletions(-)

    diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
    index 74684b2..ddf67e1 100644
    --- a/arch/x86/kvm/mmu.c
    +++ b/arch/x86/kvm/mmu.c
    @@ -2444,7 +2444,7 @@ int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn)
    }
    EXPORT_SYMBOL_GPL(kvm_mmu_unprotect_page);

    -static void __kvm_unsync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
    +static void kvm_unsync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
    {
    trace_kvm_mmu_unsync_page(sp);
    ++vcpu->kvm->stat.mmu_unsync;
    @@ -2453,39 +2453,24 @@ static void __kvm_unsync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
    kvm_mmu_mark_parents_unsync(sp);
    }

    -static void kvm_unsync_pages(struct kvm_vcpu *vcpu, gfn_t gfn)
    -{
    - struct kvm_mmu_page *s;
    -
    - for_each_gfn_indirect_valid_sp(vcpu->kvm, s, gfn) {
    - if (s->unsync)
    - continue;
    - WARN_ON(s->role.level != PT_PAGE_TABLE_LEVEL);
    - __kvm_unsync_page(vcpu, s);
    - }
    -}
    -
    static bool mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn,
    bool can_unsync)
    {
    - struct kvm_mmu_page *s;
    - bool need_unsync = false;
    + struct kvm_mmu_page *sp;

    if (kvm_page_track_is_active(vcpu, gfn, KVM_PAGE_TRACK_WRITE))
    return true;

    - for_each_gfn_indirect_valid_sp(vcpu->kvm, s, gfn) {
    + for_each_gfn_indirect_valid_sp(vcpu->kvm, sp, gfn) {
    if (!can_unsync)
    return true;

    - if (s->role.level != PT_PAGE_TABLE_LEVEL)
    - return true;
    + if (sp->unsync)
    + continue;

    - if (!s->unsync)
    - need_unsync = true;
    + WARN_ON(sp->role.level != PT_PAGE_TABLE_LEVEL);
    + kvm_unsync_page(vcpu, sp);
    }
    - if (need_unsync)
    - kvm_unsync_pages(vcpu, gfn);

    return false;
    }
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2016-02-24 11:41    [W:2.776 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site