xref: /linux/tools/testing/selftests/mm/hugepage_settings.h (revision efe86f088f48f18c27b648e5724048947f3b7fb4)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __HUGEPAGE_SETTINGS_H__
3 #define __HUGEPAGE_SETTINGS_H__
4 
5 #include <stdbool.h>
6 #include <stddef.h>
7 #include <stdint.h>
8 
9 void hugepage_save_settings(bool thp, bool hugetlb);
10 
11 /* Transparent Huge Pages (THP) */
12 
13 enum thp_enabled {
14 	THP_NEVER,
15 	THP_ALWAYS,
16 	THP_INHERIT,
17 	THP_MADVISE,
18 };
19 
20 enum thp_defrag {
21 	THP_DEFRAG_ALWAYS,
22 	THP_DEFRAG_DEFER,
23 	THP_DEFRAG_DEFER_MADVISE,
24 	THP_DEFRAG_MADVISE,
25 	THP_DEFRAG_NEVER,
26 };
27 
28 enum shmem_enabled {
29 	SHMEM_NEVER,
30 	SHMEM_ALWAYS,
31 	SHMEM_WITHIN_SIZE,
32 	SHMEM_ADVISE,
33 	SHMEM_INHERIT,
34 	SHMEM_DENY,
35 	SHMEM_FORCE,
36 };
37 
38 #define NR_ORDERS 20
39 
40 struct hugepages_settings {
41 	enum thp_enabled enabled;
42 };
43 
44 struct khugepaged_settings {
45 	bool defrag;
46 	unsigned int alloc_sleep_millisecs;
47 	unsigned int scan_sleep_millisecs;
48 	unsigned int max_ptes_none;
49 	unsigned int max_ptes_swap;
50 	unsigned int max_ptes_shared;
51 	unsigned long pages_to_scan;
52 };
53 
54 struct shmem_hugepages_settings {
55 	enum shmem_enabled enabled;
56 };
57 
58 struct thp_settings {
59 	enum thp_enabled thp_enabled;
60 	enum thp_defrag thp_defrag;
61 	enum shmem_enabled shmem_enabled;
62 	bool use_zero_page;
63 	struct khugepaged_settings khugepaged;
64 	unsigned long read_ahead_kb;
65 	struct hugepages_settings hugepages[NR_ORDERS];
66 	struct shmem_hugepages_settings shmem_hugepages[NR_ORDERS];
67 };
68 
69 int thp_read_string(const char *name, const char * const strings[]);
70 void thp_write_string(const char *name, const char *val);
71 unsigned long thp_read_num(const char *name);
72 void thp_write_num(const char *name, unsigned long num);
73 
74 void thp_write_settings(struct thp_settings *settings);
75 void thp_read_settings(struct thp_settings *settings);
76 struct thp_settings *thp_current_settings(void);
77 void thp_push_settings(struct thp_settings *settings);
78 void thp_pop_settings(void);
79 void thp_restore_settings(void);
80 
81 static inline void thp_save_settings(void)
82 {
83 	hugepage_save_settings(/* thp = */ true, /* hugetlb = */ false);
84 }
85 
86 void thp_set_read_ahead_path(char *path);
87 unsigned long thp_supported_orders(void);
88 unsigned long thp_shmem_supported_orders(void);
89 
90 bool thp_available(void);
91 bool thp_is_enabled(void);
92 
93 /* HugeTLB */
94 
95 int detect_hugetlb_page_sizes(unsigned long sizes[], int max);
96 unsigned long default_huge_page_size(void);
97 
98 unsigned long hugetlb_nr_pages(unsigned long size);
99 void hugetlb_set_nr_pages(unsigned long size, unsigned long nr);
100 unsigned long hugetlb_free_pages(unsigned long size);
101 
102 static inline void hugetlb_save_settings(void)
103 {
104 	hugepage_save_settings(/* thp = */ false, /* hugetlb = */ true);
105 }
106 
107 void hugetlb_restore_settings(void);
108 
109 static inline unsigned long hugetlb_nr_default_pages(void)
110 {
111 	unsigned long size = default_huge_page_size();
112 
113 	if (!size)
114 		return 0;
115 
116 	return hugetlb_nr_pages(size);
117 }
118 
119 static inline void hugetlb_set_nr_default_pages(unsigned long nr)
120 {
121 	unsigned long size = default_huge_page_size();
122 
123 	if (!size)
124 		return;
125 
126 	hugetlb_set_nr_pages(size, nr);
127 }
128 
129 static inline unsigned long hugetlb_free_default_pages(void)
130 {
131 	unsigned long size = default_huge_page_size();
132 
133 	if (!size)
134 		return 0;
135 
136 	return hugetlb_free_pages(size);
137 }
138 
139 static inline bool hugetlb_available(void)
140 {
141 	return default_huge_page_size() != 0;
142 }
143 
144 bool hugetlb_setup_default(unsigned long nr);
145 bool hugetlb_setup_default_exact(unsigned long nr);
146 unsigned long hugetlb_setup(unsigned long nr, unsigned long sizes[],
147 			    int max);
148 
149 #define HUGETLB_SETUP_DEFAULT_PAGES(nr_pages) \
150 static void __attribute__((constructor)) __hugetlb_setup_default(void)	\
151 {									\
152 	hugetlb_setup_default((nr_pages));				\
153 }
154 
155 #endif /* __HUGEPAGE_SETTINGS_H__ */
156