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/<pid>/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 <hugh@veritas.com> Cc: Zachary Amsden <zach@vmware.com> Cc: David Rientjes <rientjes@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
30475cc12a
commit
d6f8bb1310
@ -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; \
|
||||
})
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user