The patch titled i386: use pte_update_defer in ptep_test_and_clear_{dirty,young} has been added to the -mm tree. Its filename is i386-use-pte_update_defer-in-ptep_test_and_clear_dirtyyoung.patch *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: i386: use pte_update_defer in ptep_test_and_clear_{dirty,young} From: Zachary Amsden <zach@xxxxxxxxxx> If you actually clear the bit, you need to: + pte_update_defer(vma->vm_mm, addr, ptep); The reason is, when updating PTEs, the hypervisor must be notified. Using atomic operations to do this is fine for all hypervisors I am aware of. However, for hypervisors which shadow page tables, if these PTE modifications are not trapped, you need a post-modification call to fulfill the update of the shadow page table. Cc: Zachary Amsden <zach@xxxxxxxxxx> Cc: Hugh Dickins <hugh@xxxxxxxxxxx> Signed-off-by: David Rientjes <rientjes@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/asm-i386/pgtable.h | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff -puN include/asm-i386/pgtable.h~i386-use-pte_update_defer-in-ptep_test_and_clear_dirtyyoung include/asm-i386/pgtable.h --- a/include/asm-i386/pgtable.h~i386-use-pte_update_defer-in-ptep_test_and_clear_dirtyyoung +++ a/include/asm-i386/pgtable.h @@ -287,18 +287,24 @@ do { \ static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) { - if (!pte_dirty(*ptep)) - return 0; - return test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte_low); + int ret = 0; + if (pte_dirty(*ptep)) + ret = test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte_low); + if (ret) + pte_update_defer(vma->vm_mm, addr, ptep); + return ret; } #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) { - if (!pte_young(*ptep)) - return 0; - return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte_low); + int ret = 0; + if (pte_young(*ptep)) + ret = test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte_low); + if (ret) + pte_update_defer(vma->vm_mm, addr, ptep); + return ret; } /* @@ -317,10 +323,8 @@ do { \ ({ \ int __dirty; \ __dirty = ptep_test_and_clear_dirty((vma), (address), (ptep)); \ - if (__dirty) { \ - pte_update_defer((vma)->vm_mm, (address), (ptep)); \ + if (__dirty) \ flush_tlb_page(vma, address); \ - } \ __dirty; \ }) @@ -329,10 +333,8 @@ do { \ ({ \ int __young; \ __young = ptep_test_and_clear_young((vma), (address), (ptep)); \ - if (__young) { \ - pte_update_defer((vma)->vm_mm, (address), (ptep)); \ + if (__young) \ flush_tlb_page(vma, address); \ - } \ __young; \ }) _ Patches currently in -mm which might be from zach@xxxxxxxxxx are make-struct-vmi_ops-static.patch make-arch-i386-kernel-vmicvmi_pmd_clear-static.patch i386-use-pte_update_defer-in-ptep_test_and_clear_dirtyyoung.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html