Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _LINUX_KHUGEPAGED_H 3 : : #define _LINUX_KHUGEPAGED_H 4 : : 5 : : #include <linux/sched/coredump.h> /* MMF_VM_HUGEPAGE */ 6 : : 7 : : 8 : : #ifdef CONFIG_TRANSPARENT_HUGEPAGE 9 : : extern struct attribute_group khugepaged_attr_group; 10 : : 11 : : extern int khugepaged_init(void); 12 : : extern void khugepaged_destroy(void); 13 : : extern int start_stop_khugepaged(void); 14 : : extern int __khugepaged_enter(struct mm_struct *mm); 15 : : extern void __khugepaged_exit(struct mm_struct *mm); 16 : : extern int khugepaged_enter_vma_merge(struct vm_area_struct *vma, 17 : : unsigned long vm_flags); 18 : : #ifdef CONFIG_SHMEM 19 : : extern void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr); 20 : : #else 21 : : static inline void collapse_pte_mapped_thp(struct mm_struct *mm, 22 : : unsigned long addr) 23 : : { 24 : : } 25 : : #endif 26 : : 27 : : #define khugepaged_enabled() \ 28 : : (transparent_hugepage_flags & \ 29 : : ((1<<TRANSPARENT_HUGEPAGE_FLAG) | \ 30 : : (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG))) 31 : : #define khugepaged_always() \ 32 : : (transparent_hugepage_flags & \ 33 : : (1<<TRANSPARENT_HUGEPAGE_FLAG)) 34 : : #define khugepaged_req_madv() \ 35 : : (transparent_hugepage_flags & \ 36 : : (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG)) 37 : : #define khugepaged_defrag() \ 38 : : (transparent_hugepage_flags & \ 39 : : (1<<TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG)) 40 : : 41 : : static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm) 42 : : { 43 : : if (test_bit(MMF_VM_HUGEPAGE, &oldmm->flags)) 44 : : return __khugepaged_enter(mm); 45 : : return 0; 46 : : } 47 : : 48 : : static inline void khugepaged_exit(struct mm_struct *mm) 49 : : { 50 : : if (test_bit(MMF_VM_HUGEPAGE, &mm->flags)) 51 : : __khugepaged_exit(mm); 52 : : } 53 : : 54 : : static inline int khugepaged_enter(struct vm_area_struct *vma, 55 : : unsigned long vm_flags) 56 : : { 57 : : if (!test_bit(MMF_VM_HUGEPAGE, &vma->vm_mm->flags)) 58 : : if ((khugepaged_always() || 59 : : (khugepaged_req_madv() && (vm_flags & VM_HUGEPAGE))) && 60 : : !(vm_flags & VM_NOHUGEPAGE) && 61 : : !test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags)) 62 : : if (__khugepaged_enter(vma->vm_mm)) 63 : : return -ENOMEM; 64 : : return 0; 65 : : } 66 : : #else /* CONFIG_TRANSPARENT_HUGEPAGE */ 67 : 4706 : static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm) 68 : : { 69 : 4706 : return 0; 70 : : } 71 : 8996 : static inline void khugepaged_exit(struct mm_struct *mm) 72 : : { 73 : 8996 : } 74 : : static inline int khugepaged_enter(struct vm_area_struct *vma, 75 : : unsigned long vm_flags) 76 : : { 77 : : return 0; 78 : : } 79 : 41244 : static inline int khugepaged_enter_vma_merge(struct vm_area_struct *vma, 80 : : unsigned long vm_flags) 81 : : { 82 : 41244 : return 0; 83 : : } 84 : : static inline void collapse_pte_mapped_thp(struct mm_struct *mm, 85 : : unsigned long addr) 86 : : { 87 : : } 88 : : #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ 89 : : 90 : : #endif /* _LINUX_KHUGEPAGED_H */