khugepaged.h 2.24 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
Andrea Arcangeli's avatar
Andrea Arcangeli committed
2 3 4
#ifndef _LINUX_KHUGEPAGED_H
#define _LINUX_KHUGEPAGED_H

5 6
#include <linux/sched/coredump.h> /* MMF_VM_HUGEPAGE */

Andrea Arcangeli's avatar
Andrea Arcangeli committed
7 8

#ifdef CONFIG_TRANSPARENT_HUGEPAGE
9 10 11 12 13
extern struct attribute_group khugepaged_attr_group;

extern int khugepaged_init(void);
extern void khugepaged_destroy(void);
extern int start_stop_khugepaged(void);
Andrea Arcangeli's avatar
Andrea Arcangeli committed
14 15
extern int __khugepaged_enter(struct mm_struct *mm);
extern void __khugepaged_exit(struct mm_struct *mm);
16 17
extern int khugepaged_enter_vma_merge(struct vm_area_struct *vma,
				      unsigned long vm_flags);
Andrea Arcangeli's avatar
Andrea Arcangeli committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

#define khugepaged_enabled()					       \
	(transparent_hugepage_flags &				       \
	 ((1<<TRANSPARENT_HUGEPAGE_FLAG) |		       \
	  (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG)))
#define khugepaged_always()				\
	(transparent_hugepage_flags &			\
	 (1<<TRANSPARENT_HUGEPAGE_FLAG))
#define khugepaged_req_madv()					\
	(transparent_hugepage_flags &				\
	 (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG))
#define khugepaged_defrag()					\
	(transparent_hugepage_flags &				\
	 (1<<TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG))

static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm)
{
	if (test_bit(MMF_VM_HUGEPAGE, &oldmm->flags))
		return __khugepaged_enter(mm);
	return 0;
}

static inline void khugepaged_exit(struct mm_struct *mm)
{
	if (test_bit(MMF_VM_HUGEPAGE, &mm->flags))
		__khugepaged_exit(mm);
}

46 47
static inline int khugepaged_enter(struct vm_area_struct *vma,
				   unsigned long vm_flags)
Andrea Arcangeli's avatar
Andrea Arcangeli committed
48 49
{
	if (!test_bit(MMF_VM_HUGEPAGE, &vma->vm_mm->flags))
50
		if ((khugepaged_always() ||
51
		     (khugepaged_req_madv() && (vm_flags & VM_HUGEPAGE))) &&
52 53
		    !(vm_flags & VM_NOHUGEPAGE) &&
		    !test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags))
Andrea Arcangeli's avatar
Andrea Arcangeli committed
54 55 56 57 58 59 60 61 62 63 64 65
			if (__khugepaged_enter(vma->vm_mm))
				return -ENOMEM;
	return 0;
}
#else /* CONFIG_TRANSPARENT_HUGEPAGE */
static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm)
{
	return 0;
}
static inline void khugepaged_exit(struct mm_struct *mm)
{
}
66 67
static inline int khugepaged_enter(struct vm_area_struct *vma,
				   unsigned long vm_flags)
Andrea Arcangeli's avatar
Andrea Arcangeli committed
68 69 70
{
	return 0;
}
71 72
static inline int khugepaged_enter_vma_merge(struct vm_area_struct *vma,
					     unsigned long vm_flags)
Andrea Arcangeli's avatar
Andrea Arcangeli committed
73 74 75 76 77 78
{
	return 0;
}
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */

#endif /* _LINUX_KHUGEPAGED_H */