|
@@ -275,6 +275,13 @@ static inline unsigned long pte_update(struct mm_struct *mm,
|
|
|
return old;
|
|
return old;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/*
|
|
|
|
|
+ * We currently remove entries from the hashtable regardless of whether
|
|
|
|
|
+ * the entry was young or dirty.
|
|
|
|
|
+ *
|
|
|
|
|
+ * We should be more intelligent about this but for the moment we override
|
|
|
|
|
+ * these functions and force a tlb flush unconditionally
|
|
|
|
|
+ */
|
|
|
static inline int __ptep_test_and_clear_young(struct mm_struct *mm,
|
|
static inline int __ptep_test_and_clear_young(struct mm_struct *mm,
|
|
|
unsigned long addr, pte_t *ptep)
|
|
unsigned long addr, pte_t *ptep)
|
|
|
{
|
|
{
|
|
@@ -313,22 +320,6 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
|
|
pte_update(mm, addr, ptep, _PAGE_WRITE, 0, 1);
|
|
pte_update(mm, addr, ptep, _PAGE_WRITE, 0, 1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/*
|
|
|
|
|
- * We currently remove entries from the hashtable regardless of whether
|
|
|
|
|
- * the entry was young or dirty. The generic routines only flush if the
|
|
|
|
|
- * entry was young or dirty which is not good enough.
|
|
|
|
|
- *
|
|
|
|
|
- * We should be more intelligent about this but for the moment we override
|
|
|
|
|
- * these functions and force a tlb flush unconditionally
|
|
|
|
|
- */
|
|
|
|
|
-#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
|
|
|
|
|
-#define ptep_clear_flush_young(__vma, __address, __ptep) \
|
|
|
|
|
-({ \
|
|
|
|
|
- int __young = __ptep_test_and_clear_young((__vma)->vm_mm, __address, \
|
|
|
|
|
- __ptep); \
|
|
|
|
|
- __young; \
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
|
|
#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
|
|
|
static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
|
|
static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
|
|
|
unsigned long addr, pte_t *ptep)
|
|
unsigned long addr, pte_t *ptep)
|