1 #ifndef _LINUX_KHUGEPAGED_H
2 #define _LINUX_KHUGEPAGED_H
3 
4 #include <linux/sched.h> /* MMF_VM_HUGEPAGE */
5 
6 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
7 extern int __khugepaged_enter(struct mm_struct *mm);
8 extern void __khugepaged_exit(struct mm_struct *mm);
9 extern int khugepaged_enter_vma_merge(struct vm_area_struct *vma,
10 				      unsigned long vm_flags);
11 
12 #define khugepaged_enabled()					       \
13 	(transparent_hugepage_flags &				       \
14 	 ((1<<TRANSPARENT_HUGEPAGE_FLAG) |		       \
15 	  (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG)))
16 #define khugepaged_always()				\
17 	(transparent_hugepage_flags &			\
18 	 (1<<TRANSPARENT_HUGEPAGE_FLAG))
19 #define khugepaged_req_madv()					\
20 	(transparent_hugepage_flags &				\
21 	 (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG))
22 #define khugepaged_defrag()					\
23 	(transparent_hugepage_flags &				\
24 	 (1<<TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG))
25 
khugepaged_fork(struct mm_struct * mm,struct mm_struct * oldmm)26 static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm)
27 {
28 	if (test_bit(MMF_VM_HUGEPAGE, &oldmm->flags))
29 		return __khugepaged_enter(mm);
30 	return 0;
31 }
32 
khugepaged_exit(struct mm_struct * mm)33 static inline void khugepaged_exit(struct mm_struct *mm)
34 {
35 	if (test_bit(MMF_VM_HUGEPAGE, &mm->flags))
36 		__khugepaged_exit(mm);
37 }
38 
khugepaged_enter(struct vm_area_struct * vma,unsigned long vm_flags)39 static inline int khugepaged_enter(struct vm_area_struct *vma,
40 				   unsigned long vm_flags)
41 {
42 	if (!test_bit(MMF_VM_HUGEPAGE, &vma->vm_mm->flags))
43 		if ((khugepaged_always() ||
44 		     (khugepaged_req_madv() && (vm_flags & VM_HUGEPAGE))) &&
45 		    !(vm_flags & VM_NOHUGEPAGE))
46 			if (__khugepaged_enter(vma->vm_mm))
47 				return -ENOMEM;
48 	return 0;
49 }
50 #else /* CONFIG_TRANSPARENT_HUGEPAGE */
khugepaged_fork(struct mm_struct * mm,struct mm_struct * oldmm)51 static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm)
52 {
53 	return 0;
54 }
khugepaged_exit(struct mm_struct * mm)55 static inline void khugepaged_exit(struct mm_struct *mm)
56 {
57 }
khugepaged_enter(struct vm_area_struct * vma,unsigned long vm_flags)58 static inline int khugepaged_enter(struct vm_area_struct *vma,
59 				   unsigned long vm_flags)
60 {
61 	return 0;
62 }
khugepaged_enter_vma_merge(struct vm_area_struct * vma,unsigned long vm_flags)63 static inline int khugepaged_enter_vma_merge(struct vm_area_struct *vma,
64 					     unsigned long vm_flags)
65 {
66 	return 0;
67 }
68 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
69 
70 #endif /* _LINUX_KHUGEPAGED_H */
71