aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/asm-i386/pgtable.h41
1 files changed, 28 insertions, 13 deletions
diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h
index 541b3e234335..94c87ff4b5ac 100644
--- a/include/asm-i386/pgtable.h
+++ b/include/asm-i386/pgtable.h
@@ -262,21 +262,36 @@ do { \
262 } \ 262 } \
263} while (0) 263} while (0)
264 264
265/*
266 * We don't actually have these, but we want to advertise them so that
267 * we can encompass the flush here.
268 */
265#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY 269#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
266static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
267{
268 if (!pte_dirty(*ptep))
269 return 0;
270 return test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte_low);
271}
272
273#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG 270#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
274static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) 271
275{ 272#define __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH
276 if (!pte_young(*ptep)) 273#define ptep_clear_flush_dirty(vma, address, ptep) \
277 return 0; 274({ \
278 return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte_low); 275 int __dirty; \
279} 276 __dirty = pte_dirty(*(ptep)); \
277 if (__dirty) { \
278 clear_bit(_PAGE_BIT_DIRTY, &(ptep)->pte_low); \
279 flush_tlb_page(vma, address); \
280 } \
281 __dirty; \
282})
283
284#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
285#define ptep_clear_flush_young(vma, address, ptep) \
286({ \
287 int __young; \
288 __young = pte_young(*(ptep)); \
289 if (__young) { \
290 clear_bit(_PAGE_BIT_ACCESSED, &(ptep)->pte_low); \
291 flush_tlb_page(vma, address); \
292 } \
293 __young; \
294})
280 295
281#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL 296#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
282static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full) 297static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full)