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

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
...@@ -177,10 +177,10 @@ static int FNAME(walk_addr)(struct guest_walker *walker, ...@@ -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, ...@@ -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;
} }
......
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