xref: /linux/tools/lib/mm/hugepage_settings.h (revision ceffb8ff832ed5ea7d81b5ec7794399bccb5b955)
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 /*
91  * The per-order shmem_enabled attribute is created for the orders the page
92  * cache can hold, not just for shmem, so it answers for regular files too.
93  */
94 static inline unsigned long thp_file_supported_orders(void)
95 {
96 	return thp_shmem_supported_orders();
97 }
98 
99 bool thp_available(void);
100 bool thp_is_enabled(void);
101 
102 /* HugeTLB */
103 
104 int detect_hugetlb_page_sizes(unsigned long sizes[], int max);
105 unsigned long default_huge_page_size(void);
106 
107 unsigned long hugetlb_nr_pages(unsigned long size);
108 void hugetlb_set_nr_pages(unsigned long size, unsigned long nr);
109 unsigned long hugetlb_free_pages(unsigned long size);
110 unsigned long hugetlb_nr_resv_pages(unsigned long size);
111 
112 static inline void hugetlb_save_settings(void)
113 {
114 	hugepage_save_settings(/* thp = */ false, /* hugetlb = */ true);
115 }
116 
117 void hugetlb_restore_settings(void);
118 
119 static inline unsigned long hugetlb_nr_default_pages(void)
120 {
121 	unsigned long size = default_huge_page_size();
122 
123 	if (!size)
124 		return 0;
125 
126 	return hugetlb_nr_pages(size);
127 }
128 
129 static inline void hugetlb_set_nr_default_pages(unsigned long nr)
130 {
131 	unsigned long size = default_huge_page_size();
132 
133 	if (!size)
134 		return;
135 
136 	hugetlb_set_nr_pages(size, nr);
137 }
138 
139 static inline unsigned long hugetlb_free_default_pages(void)
140 {
141 	unsigned long size = default_huge_page_size();
142 
143 	if (!size)
144 		return 0;
145 
146 	return hugetlb_free_pages(size);
147 }
148 
149 static inline bool hugetlb_available(void)
150 {
151 	return default_huge_page_size() != 0;
152 }
153 
154 bool hugetlb_setup_default(unsigned long nr);
155 bool hugetlb_setup_default_exact(unsigned long nr);
156 unsigned long hugetlb_setup(unsigned long nr, unsigned long sizes[],
157 			    int max);
158 
159 #define HUGETLB_SETUP_DEFAULT_PAGES(nr_pages) \
160 static void __attribute__((constructor)) __hugetlb_setup_default(void)	\
161 {									\
162 	hugetlb_setup_default((nr_pages));				\
163 }
164 
165 #endif /* __HUGEPAGE_SETTINGS_H__ */
166