Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+40 −0
Original line number Original line Diff line number Diff line
@@ -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)
	__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)
}
}


#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 */