The patch titled paravirt: combine flush accessed dirty.patch has been added to the -mm tree. Its filename is paravirt-combine-flush-accessed-dirty.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: paravirt: combine flush accessed dirty.patch From: Zachary Amsden <zach@xxxxxxxxxx> Remove ptep_test_and_clear_{dirty|young} from i386, and instead use the dominating functions, ptep_clear_flush_{dirty|young}. This allows the TLB page flush to be contained in the same macro, and allows for an eager optimization - if reading the PTE initially returned dirty/accessed, we can assume the fact that no subsequent update to the PTE which cleared accessed / dirty has occurred, as the only way A/D bits can change without holding the page table lock is if a remote processor clears them. This eliminates an extra branch which came from the generic version of the code, as we know that no other CPU could have cleared the A/D bit, so the flush will always be needed. We still export these two defines, even though we do not actually define the macros in the i386 code: #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY The reason for this is that the only use of these functions is within the generic clear_flush functions, and we want a strong guarantee that there are no other users of these functions, so we want to prevent the generic code from defining them for us. Signed-off-by: Zachary Amsden <zach@xxxxxxxxxx> Cc: Rusty Russell <rusty@xxxxxxxxxxxxxxx> Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- include/asm-i386/pgtable.h | 41 +++++++++++++++++++++++------------ 1 files changed, 28 insertions(+), 13 deletions(-) diff -puN include/asm-i386/pgtable.h~paravirt-combine-flush-accessed-dirty include/asm-i386/pgtable.h --- a/include/asm-i386/pgtable.h~paravirt-combine-flush-accessed-dirty +++ a/include/asm-i386/pgtable.h @@ -262,21 +262,36 @@ do { \ } \ } while (0) +/* + * We don't actually have these, but we want to advertise them so that + * we can encompass the flush here. + */ #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY -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); -} - #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); -} + +#define __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH +#define ptep_clear_flush_dirty(vma, address, ptep) \ +({ \ + int __dirty; \ + __dirty = pte_dirty(*(ptep)); \ + if (__dirty) { \ + clear_bit(_PAGE_BIT_DIRTY, &(ptep)->pte_low); \ + flush_tlb_page(vma, address); \ + } \ + __dirty; \ +}) + +#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH +#define ptep_clear_flush_young(vma, address, ptep) \ +({ \ + int __young; \ + __young = pte_young(*(ptep)); \ + if (__young) { \ + clear_bit(_PAGE_BIT_ACCESSED, &(ptep)->pte_low); \ + flush_tlb_page(vma, address); \ + } \ + __young; \ +}) #define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full) _ Patches currently in -mm which might be from zach@xxxxxxxxxx are split-i386-and-x86_64-ptraceh.patch uml-use-ptrace-abih-instead-of-ptraceh.patch x86-allow-a-kernel-to-not-be-in-ring-0.patch x86-allow-a-kernel-to-not-be-in-ring-0-tidy.patch x86-add-a-bootparameter-to-reserve-high-linear-address-space.patch x86-trivial-pgtableh-__assembly__-move.patch x86-trivial-move-of-__have-macros-in-i386-pagetable-headers.patch x86-trivial-move-of-ptep_set_access_flags.patch x86-remove-unused-include-from-efi_stubs.patch paravirt-remove-read-hazard-from-cow.patch paravirt-pte-clear-not-present.patch paravirt-lazy-mmu-mode-hooks.patch paravirt-combine-flush-accessed-dirty.patch paravirt-kpte-flush.patch paravirt-optimize-ptep-establish-for-pae.patch paravirt-remove-set-pte-atomic.patch paravirt-pae-compile-fix.patch paravirt-update-pte-hook.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