mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
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: Xiao Guangrong <guangrong.xiao@linux.intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
56ca57f9fe
commit
5c520e90af
1 changed files with 7 additions and 22 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue