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
7extern int __khugepaged_enter(struct mm_struct *mm);
8extern void __khugepaged_exit(struct mm_struct *mm);
9extern 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
26static 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
33static inline void khugepaged_exit(struct mm_struct *mm)
34{
35	if (test_bit(MMF_VM_HUGEPAGE, &mm->flags))
36		__khugepaged_exit(mm);
37}
38
39static 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 */
51static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm)
52{
53	return 0;
54}
55static inline void khugepaged_exit(struct mm_struct *mm)
56{
57}
58static inline int khugepaged_enter(struct vm_area_struct *vma,
59				   unsigned long vm_flags)
60{
61	return 0;
62}
63static 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