KVM: MMU: do not update slot bitmap if spte is nonpresent
Set slot bitmap only if the spte is present Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
052331bea3
commit
ffb61bb3bc
@ -743,9 +743,6 @@ static int rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn)
|
|||||||
struct kvm_mmu_page *sp;
|
struct kvm_mmu_page *sp;
|
||||||
unsigned long *rmapp;
|
unsigned long *rmapp;
|
||||||
|
|
||||||
if (!is_rmap_spte(*spte))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
sp = page_header(__pa(spte));
|
sp = page_header(__pa(spte));
|
||||||
kvm_mmu_page_set_gfn(sp, spte - sp->spt, gfn);
|
kvm_mmu_page_set_gfn(sp, spte - sp->spt, gfn);
|
||||||
rmapp = gfn_to_rmap(vcpu->kvm, gfn, sp->role.level);
|
rmapp = gfn_to_rmap(vcpu->kvm, gfn, sp->role.level);
|
||||||
@ -2087,11 +2084,13 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
|
|||||||
if (!was_rmapped && is_large_pte(*sptep))
|
if (!was_rmapped && is_large_pte(*sptep))
|
||||||
++vcpu->kvm->stat.lpages;
|
++vcpu->kvm->stat.lpages;
|
||||||
|
|
||||||
page_header_update_slot(vcpu->kvm, sptep, gfn);
|
if (is_shadow_present_pte(*sptep)) {
|
||||||
if (!was_rmapped) {
|
page_header_update_slot(vcpu->kvm, sptep, gfn);
|
||||||
rmap_count = rmap_add(vcpu, sptep, gfn);
|
if (!was_rmapped) {
|
||||||
if (rmap_count > RMAP_RECYCLE_THRESHOLD)
|
rmap_count = rmap_add(vcpu, sptep, gfn);
|
||||||
rmap_recycle(vcpu, sptep, gfn);
|
if (rmap_count > RMAP_RECYCLE_THRESHOLD)
|
||||||
|
rmap_recycle(vcpu, sptep, gfn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
kvm_release_pfn_clean(pfn);
|
kvm_release_pfn_clean(pfn);
|
||||||
if (speculative) {
|
if (speculative) {
|
||||||
|
Loading…
Reference in New Issue
Block a user