|
@@ -57,10 +57,13 @@ struct mmu_notifier_ops {
|
|
* pte. This way the VM will provide proper aging to the
|
|
* pte. This way the VM will provide proper aging to the
|
|
* accesses to the page through the secondary MMUs and not
|
|
* accesses to the page through the secondary MMUs and not
|
|
* only to the ones through the Linux pte.
|
|
* only to the ones through the Linux pte.
|
|
|
|
+ * Start-end is necessary in case the secondary MMU is mapping the page
|
|
|
|
+ * at a smaller granularity than the primary MMU.
|
|
*/
|
|
*/
|
|
int (*clear_flush_young)(struct mmu_notifier *mn,
|
|
int (*clear_flush_young)(struct mmu_notifier *mn,
|
|
struct mm_struct *mm,
|
|
struct mm_struct *mm,
|
|
- unsigned long address);
|
|
|
|
|
|
+ unsigned long start,
|
|
|
|
+ unsigned long end);
|
|
|
|
|
|
/*
|
|
/*
|
|
* test_young is called to check the young/accessed bitflag in
|
|
* test_young is called to check the young/accessed bitflag in
|
|
@@ -175,7 +178,8 @@ extern void mmu_notifier_unregister_no_release(struct mmu_notifier *mn,
|
|
extern void __mmu_notifier_mm_destroy(struct mm_struct *mm);
|
|
extern void __mmu_notifier_mm_destroy(struct mm_struct *mm);
|
|
extern void __mmu_notifier_release(struct mm_struct *mm);
|
|
extern void __mmu_notifier_release(struct mm_struct *mm);
|
|
extern int __mmu_notifier_clear_flush_young(struct mm_struct *mm,
|
|
extern int __mmu_notifier_clear_flush_young(struct mm_struct *mm,
|
|
- unsigned long address);
|
|
|
|
|
|
+ unsigned long start,
|
|
|
|
+ unsigned long end);
|
|
extern int __mmu_notifier_test_young(struct mm_struct *mm,
|
|
extern int __mmu_notifier_test_young(struct mm_struct *mm,
|
|
unsigned long address);
|
|
unsigned long address);
|
|
extern void __mmu_notifier_change_pte(struct mm_struct *mm,
|
|
extern void __mmu_notifier_change_pte(struct mm_struct *mm,
|
|
@@ -194,10 +198,11 @@ static inline void mmu_notifier_release(struct mm_struct *mm)
|
|
}
|
|
}
|
|
|
|
|
|
static inline int mmu_notifier_clear_flush_young(struct mm_struct *mm,
|
|
static inline int mmu_notifier_clear_flush_young(struct mm_struct *mm,
|
|
- unsigned long address)
|
|
|
|
|
|
+ unsigned long start,
|
|
|
|
+ unsigned long end)
|
|
{
|
|
{
|
|
if (mm_has_notifiers(mm))
|
|
if (mm_has_notifiers(mm))
|
|
- return __mmu_notifier_clear_flush_young(mm, address);
|
|
|
|
|
|
+ return __mmu_notifier_clear_flush_young(mm, start, end);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -255,7 +260,9 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm)
|
|
unsigned long ___address = __address; \
|
|
unsigned long ___address = __address; \
|
|
__young = ptep_clear_flush_young(___vma, ___address, __ptep); \
|
|
__young = ptep_clear_flush_young(___vma, ___address, __ptep); \
|
|
__young |= mmu_notifier_clear_flush_young(___vma->vm_mm, \
|
|
__young |= mmu_notifier_clear_flush_young(___vma->vm_mm, \
|
|
- ___address); \
|
|
|
|
|
|
+ ___address, \
|
|
|
|
+ ___address + \
|
|
|
|
+ PAGE_SIZE); \
|
|
__young; \
|
|
__young; \
|
|
})
|
|
})
|
|
|
|
|
|
@@ -266,7 +273,9 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm)
|
|
unsigned long ___address = __address; \
|
|
unsigned long ___address = __address; \
|
|
__young = pmdp_clear_flush_young(___vma, ___address, __pmdp); \
|
|
__young = pmdp_clear_flush_young(___vma, ___address, __pmdp); \
|
|
__young |= mmu_notifier_clear_flush_young(___vma->vm_mm, \
|
|
__young |= mmu_notifier_clear_flush_young(___vma->vm_mm, \
|
|
- ___address); \
|
|
|
|
|
|
+ ___address, \
|
|
|
|
+ ___address + \
|
|
|
|
+ PMD_SIZE); \
|
|
__young; \
|
|
__young; \
|
|
})
|
|
})
|
|
|
|
|
|
@@ -301,7 +310,8 @@ static inline void mmu_notifier_release(struct mm_struct *mm)
|
|
}
|
|
}
|
|
|
|
|
|
static inline int mmu_notifier_clear_flush_young(struct mm_struct *mm,
|
|
static inline int mmu_notifier_clear_flush_young(struct mm_struct *mm,
|
|
- unsigned long address)
|
|
|
|
|
|
+ unsigned long start,
|
|
|
|
+ unsigned long end)
|
|
{
|
|
{
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|