Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3b8c964 authored by Gui Jianfeng's avatar Gui Jianfeng Committed by Avi Kivity
Browse files

KVM: MMU: mark page table dirty when a pte is actually modified



Sometime cmpxchg_gpte doesn't modify gpte, in such case, don't mark
page table page as dirty.

Signed-off-by: default avatarGui Jianfeng <guijianfeng@cn.fujitsu.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent eec4b140
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -177,10 +177,10 @@ static int FNAME(walk_addr)(struct guest_walker *walker,
		if (!(pte & PT_ACCESSED_MASK)) {
		if (!(pte & PT_ACCESSED_MASK)) {
			trace_kvm_mmu_set_accessed_bit(table_gfn, index,
			trace_kvm_mmu_set_accessed_bit(table_gfn, index,
						       sizeof(pte));
						       sizeof(pte));
			mark_page_dirty(vcpu->kvm, table_gfn);
			if (FNAME(cmpxchg_gpte)(vcpu->kvm, table_gfn,
			if (FNAME(cmpxchg_gpte)(vcpu->kvm, table_gfn,
			    index, pte, pte|PT_ACCESSED_MASK))
			    index, pte, pte|PT_ACCESSED_MASK))
				goto walk;
				goto walk;
			mark_page_dirty(vcpu->kvm, table_gfn);
			pte |= PT_ACCESSED_MASK;
			pte |= PT_ACCESSED_MASK;
		}
		}


@@ -217,11 +217,11 @@ static int FNAME(walk_addr)(struct guest_walker *walker,
		bool ret;
		bool ret;


		trace_kvm_mmu_set_dirty_bit(table_gfn, index, sizeof(pte));
		trace_kvm_mmu_set_dirty_bit(table_gfn, index, sizeof(pte));
		mark_page_dirty(vcpu->kvm, table_gfn);
		ret = FNAME(cmpxchg_gpte)(vcpu->kvm, table_gfn, index, pte,
		ret = FNAME(cmpxchg_gpte)(vcpu->kvm, table_gfn, index, pte,
			    pte|PT_DIRTY_MASK);
			    pte|PT_DIRTY_MASK);
		if (ret)
		if (ret)
			goto walk;
			goto walk;
		mark_page_dirty(vcpu->kvm, table_gfn);
		pte |= PT_DIRTY_MASK;
		pte |= PT_DIRTY_MASK;
		walker->ptes[walker->level - 1] = pte;
		walker->ptes[walker->level - 1] = pte;
	}
	}