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