Commit 91a4ee26 authored by Andrea Arcangeli's avatar Andrea Arcangeli Committed by Linus Torvalds

thp: add pmd mmu_notifier helpers

Add mmu notifier helpers to handle pmd huge operations.
Signed-off-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
Acked-by: default avatarRik van Riel <riel@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8ac1f832
...@@ -243,6 +243,32 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm) ...@@ -243,6 +243,32 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm)
__pte; \ __pte; \
}) })
#define pmdp_clear_flush_notify(__vma, __address, __pmdp) \
({ \
pmd_t __pmd; \
struct vm_area_struct *___vma = __vma; \
unsigned long ___address = __address; \
VM_BUG_ON(__address & ~HPAGE_PMD_MASK); \
mmu_notifier_invalidate_range_start(___vma->vm_mm, ___address, \
(__address)+HPAGE_PMD_SIZE);\
__pmd = pmdp_clear_flush(___vma, ___address, __pmdp); \
mmu_notifier_invalidate_range_end(___vma->vm_mm, ___address, \
(__address)+HPAGE_PMD_SIZE); \
__pmd; \
})
#define pmdp_splitting_flush_notify(__vma, __address, __pmdp) \
({ \
struct vm_area_struct *___vma = __vma; \
unsigned long ___address = __address; \
VM_BUG_ON(__address & ~HPAGE_PMD_MASK); \
mmu_notifier_invalidate_range_start(___vma->vm_mm, ___address, \
(__address)+HPAGE_PMD_SIZE);\
pmdp_splitting_flush(___vma, ___address, __pmdp); \
mmu_notifier_invalidate_range_end(___vma->vm_mm, ___address, \
(__address)+HPAGE_PMD_SIZE); \
})
#define ptep_clear_flush_young_notify(__vma, __address, __ptep) \ #define ptep_clear_flush_young_notify(__vma, __address, __ptep) \
({ \ ({ \
int __young; \ int __young; \
...@@ -254,6 +280,17 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm) ...@@ -254,6 +280,17 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm)
__young; \ __young; \
}) })
#define pmdp_clear_flush_young_notify(__vma, __address, __pmdp) \
({ \
int __young; \
struct vm_area_struct *___vma = __vma; \
unsigned long ___address = __address; \
__young = pmdp_clear_flush_young(___vma, ___address, __pmdp); \
__young |= mmu_notifier_clear_flush_young(___vma->vm_mm, \
___address); \
__young; \
})
#define set_pte_at_notify(__mm, __address, __ptep, __pte) \ #define set_pte_at_notify(__mm, __address, __ptep, __pte) \
({ \ ({ \
struct mm_struct *___mm = __mm; \ struct mm_struct *___mm = __mm; \
...@@ -305,7 +342,10 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm) ...@@ -305,7 +342,10 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm)
} }
#define ptep_clear_flush_young_notify ptep_clear_flush_young #define ptep_clear_flush_young_notify ptep_clear_flush_young
#define pmdp_clear_flush_young_notify pmdp_clear_flush_young
#define ptep_clear_flush_notify ptep_clear_flush #define ptep_clear_flush_notify ptep_clear_flush
#define pmdp_clear_flush_notify pmdp_clear_flush
#define pmdp_splitting_flush_notify pmdp_splitting_flush
#define set_pte_at_notify set_pte_at #define set_pte_at_notify set_pte_at
#endif /* CONFIG_MMU_NOTIFIER */ #endif /* CONFIG_MMU_NOTIFIER */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment