From d6f8bb1310d4745ff1d0c74eeacae31e2a3eeff1 Mon Sep 17 00:00:00 2001 From: Hugh Dickins Date: Sat, 16 Jun 2007 10:15:59 -0700 Subject: [PATCH] i386 mm: use pte_update() in ptep_test_and_clear_dirty() It is not safe to use pte_update_defer() in ptep_test_and_clear_young(): its only user, /proc//clear_refs, drops pte lock before flushing TLB. Use the safe though less efficient pte_update() paravirtop in its place. Likewise in ptep_test_and_clear_dirty(), though that has no current use. These are macros (header file dependency stops them from becoming inline functions), so be more liberal with the underscores and parentheses. Signed-off-by: Hugh Dickins Cc: Zachary Amsden Cc: David Rientjes Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- include/asm-i386/pgtable.h | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h index 2394589786ba..d62bdb029efa 100644 --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h @@ -295,22 +295,24 @@ do { \ #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY #define ptep_test_and_clear_dirty(vma, addr, ptep) ({ \ - 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); \ - ret; \ + int __ret = 0; \ + if (pte_dirty(*(ptep))) \ + __ret = test_and_clear_bit(_PAGE_BIT_DIRTY, \ + &(ptep)->pte_low); \ + if (__ret) \ + pte_update((vma)->vm_mm, addr, ptep); \ + __ret; \ }) #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG #define ptep_test_and_clear_young(vma, addr, ptep) ({ \ - 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); \ - ret; \ + int __ret = 0; \ + if (pte_young(*(ptep))) \ + __ret = test_and_clear_bit(_PAGE_BIT_ACCESSED, \ + &(ptep)->pte_low); \ + if (__ret) \ + pte_update((vma)->vm_mm, addr, ptep); \ + __ret; \ }) /* -- 2.30.2