KVM: MMU: mark page table dirty when a pte is actually modified
authorGui Jianfeng <guijianfeng@cn.fujitsu.com>
Wed, 5 May 2010 01:09:21 +0000 (09:09 +0800)
committerAvi Kivity <avi@redhat.com>
Sun, 1 Aug 2010 07:35:38 +0000 (10:35 +0300)
Sometime cmpxchg_gpte doesn't modify gpte, in such case, don't mark
page table page as dirty.

Signed-off-by: Gui Jianfeng <guijianfeng@cn.fujitsu.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/paging_tmpl.h

index c7f27779c998629d728ffd3529f0f7acfd678158..5c8ac060442fdc818d658205d56948c1b3cab5d6 100644 (file)
@@ -177,10 +177,10 @@ walk:
                if (!(pte & PT_ACCESSED_MASK)) {
                        trace_kvm_mmu_set_accessed_bit(table_gfn, index,
                                                       sizeof(pte));
-                       mark_page_dirty(vcpu->kvm, table_gfn);
                        if (FNAME(cmpxchg_gpte)(vcpu->kvm, table_gfn,
                            index, pte, pte|PT_ACCESSED_MASK))
                                goto walk;
+                       mark_page_dirty(vcpu->kvm, table_gfn);
                        pte |= PT_ACCESSED_MASK;
                }
 
@@ -217,11 +217,11 @@ walk:
                bool ret;
 
                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,
                            pte|PT_DIRTY_MASK);
                if (ret)
                        goto walk;
+               mark_page_dirty(vcpu->kvm, table_gfn);
                pte |= PT_DIRTY_MASK;
                walker->ptes[walker->level - 1] = pte;
        }