Commit 5c520e90 authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Paolo Bonzini

KVM: MMU: simplify mmu_need_write_protect

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: default avatarXiao Guangrong <guangrong.xiao@linux.intel.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 56ca57f9
...@@ -2444,7 +2444,7 @@ int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn) ...@@ -2444,7 +2444,7 @@ int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn)
} }
EXPORT_SYMBOL_GPL(kvm_mmu_unprotect_page); 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); trace_kvm_mmu_unsync_page(sp);
++vcpu->kvm->stat.mmu_unsync; ++vcpu->kvm->stat.mmu_unsync;
...@@ -2453,39 +2453,24 @@ static void __kvm_unsync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) ...@@ -2453,39 +2453,24 @@ static void __kvm_unsync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
kvm_mmu_mark_parents_unsync(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, static bool mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn,
bool can_unsync) bool can_unsync)
{ {
struct kvm_mmu_page *s; struct kvm_mmu_page *sp;
bool need_unsync = false;
if (kvm_page_track_is_active(vcpu, gfn, KVM_PAGE_TRACK_WRITE)) if (kvm_page_track_is_active(vcpu, gfn, KVM_PAGE_TRACK_WRITE))
return true; 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) if (!can_unsync)
return true; return true;
if (s->role.level != PT_PAGE_TABLE_LEVEL) if (sp->unsync)
return true; continue;
if (!s->unsync) WARN_ON(sp->role.level != PT_PAGE_TABLE_LEVEL);
need_unsync = true; kvm_unsync_page(vcpu, sp);
} }
if (need_unsync)
kvm_unsync_pages(vcpu, gfn);
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment