xref: /linux/tools/testing/selftests/mm/hugepage_settings.h (revision 00599d4841790d05401820a96cf7edb193888b00)
181afb1eeSMike Rapoport (Microsoft) /* SPDX-License-Identifier: GPL-2.0 */
281afb1eeSMike Rapoport (Microsoft) #ifndef __HUGEPAGE_SETTINGS_H__
381afb1eeSMike Rapoport (Microsoft) #define __HUGEPAGE_SETTINGS_H__
481afb1eeSMike Rapoport (Microsoft) 
581afb1eeSMike Rapoport (Microsoft) #include <stdbool.h>
681afb1eeSMike Rapoport (Microsoft) #include <stddef.h>
781afb1eeSMike Rapoport (Microsoft) #include <stdint.h>
881afb1eeSMike Rapoport (Microsoft) 
9*08e51ae5SMike Rapoport (Microsoft) void hugepage_save_settings(bool thp, bool hugetlb);
10*08e51ae5SMike Rapoport (Microsoft) 
111bdc1698SMike Rapoport (Microsoft) /* Transparent Huge Pages (THP) */
121bdc1698SMike Rapoport (Microsoft) 
1381afb1eeSMike Rapoport (Microsoft) enum thp_enabled {
1481afb1eeSMike Rapoport (Microsoft) 	THP_NEVER,
1581afb1eeSMike Rapoport (Microsoft) 	THP_ALWAYS,
1681afb1eeSMike Rapoport (Microsoft) 	THP_INHERIT,
1781afb1eeSMike Rapoport (Microsoft) 	THP_MADVISE,
1881afb1eeSMike Rapoport (Microsoft) };
1981afb1eeSMike Rapoport (Microsoft) 
2081afb1eeSMike Rapoport (Microsoft) enum thp_defrag {
2181afb1eeSMike Rapoport (Microsoft) 	THP_DEFRAG_ALWAYS,
2281afb1eeSMike Rapoport (Microsoft) 	THP_DEFRAG_DEFER,
2381afb1eeSMike Rapoport (Microsoft) 	THP_DEFRAG_DEFER_MADVISE,
2481afb1eeSMike Rapoport (Microsoft) 	THP_DEFRAG_MADVISE,
2581afb1eeSMike Rapoport (Microsoft) 	THP_DEFRAG_NEVER,
2681afb1eeSMike Rapoport (Microsoft) };
2781afb1eeSMike Rapoport (Microsoft) 
2881afb1eeSMike Rapoport (Microsoft) enum shmem_enabled {
2981afb1eeSMike Rapoport (Microsoft) 	SHMEM_NEVER,
3081afb1eeSMike Rapoport (Microsoft) 	SHMEM_ALWAYS,
3181afb1eeSMike Rapoport (Microsoft) 	SHMEM_WITHIN_SIZE,
3281afb1eeSMike Rapoport (Microsoft) 	SHMEM_ADVISE,
3381afb1eeSMike Rapoport (Microsoft) 	SHMEM_INHERIT,
3481afb1eeSMike Rapoport (Microsoft) 	SHMEM_DENY,
3581afb1eeSMike Rapoport (Microsoft) 	SHMEM_FORCE,
3681afb1eeSMike Rapoport (Microsoft) };
3781afb1eeSMike Rapoport (Microsoft) 
3881afb1eeSMike Rapoport (Microsoft) #define NR_ORDERS 20
3981afb1eeSMike Rapoport (Microsoft) 
4081afb1eeSMike Rapoport (Microsoft) struct hugepages_settings {
4181afb1eeSMike Rapoport (Microsoft) 	enum thp_enabled enabled;
4281afb1eeSMike Rapoport (Microsoft) };
4381afb1eeSMike Rapoport (Microsoft) 
4481afb1eeSMike Rapoport (Microsoft) struct khugepaged_settings {
4581afb1eeSMike Rapoport (Microsoft) 	bool defrag;
4681afb1eeSMike Rapoport (Microsoft) 	unsigned int alloc_sleep_millisecs;
4781afb1eeSMike Rapoport (Microsoft) 	unsigned int scan_sleep_millisecs;
4881afb1eeSMike Rapoport (Microsoft) 	unsigned int max_ptes_none;
4981afb1eeSMike Rapoport (Microsoft) 	unsigned int max_ptes_swap;
5081afb1eeSMike Rapoport (Microsoft) 	unsigned int max_ptes_shared;
5181afb1eeSMike Rapoport (Microsoft) 	unsigned long pages_to_scan;
5281afb1eeSMike Rapoport (Microsoft) };
5381afb1eeSMike Rapoport (Microsoft) 
5481afb1eeSMike Rapoport (Microsoft) struct shmem_hugepages_settings {
5581afb1eeSMike Rapoport (Microsoft) 	enum shmem_enabled enabled;
5681afb1eeSMike Rapoport (Microsoft) };
5781afb1eeSMike Rapoport (Microsoft) 
5881afb1eeSMike Rapoport (Microsoft) struct thp_settings {
5981afb1eeSMike Rapoport (Microsoft) 	enum thp_enabled thp_enabled;
6081afb1eeSMike Rapoport (Microsoft) 	enum thp_defrag thp_defrag;
6181afb1eeSMike Rapoport (Microsoft) 	enum shmem_enabled shmem_enabled;
6281afb1eeSMike Rapoport (Microsoft) 	bool use_zero_page;
6381afb1eeSMike Rapoport (Microsoft) 	struct khugepaged_settings khugepaged;
6481afb1eeSMike Rapoport (Microsoft) 	unsigned long read_ahead_kb;
6581afb1eeSMike Rapoport (Microsoft) 	struct hugepages_settings hugepages[NR_ORDERS];
6681afb1eeSMike Rapoport (Microsoft) 	struct shmem_hugepages_settings shmem_hugepages[NR_ORDERS];
6781afb1eeSMike Rapoport (Microsoft) };
6881afb1eeSMike Rapoport (Microsoft) 
6981afb1eeSMike Rapoport (Microsoft) int thp_read_string(const char *name, const char * const strings[]);
7081afb1eeSMike Rapoport (Microsoft) void thp_write_string(const char *name, const char *val);
7181afb1eeSMike Rapoport (Microsoft) unsigned long thp_read_num(const char *name);
7281afb1eeSMike Rapoport (Microsoft) void thp_write_num(const char *name, unsigned long num);
7381afb1eeSMike Rapoport (Microsoft) 
7481afb1eeSMike Rapoport (Microsoft) void thp_write_settings(struct thp_settings *settings);
7581afb1eeSMike Rapoport (Microsoft) void thp_read_settings(struct thp_settings *settings);
7681afb1eeSMike Rapoport (Microsoft) struct thp_settings *thp_current_settings(void);
7781afb1eeSMike Rapoport (Microsoft) void thp_push_settings(struct thp_settings *settings);
7881afb1eeSMike Rapoport (Microsoft) void thp_pop_settings(void);
7981afb1eeSMike Rapoport (Microsoft) void thp_restore_settings(void);
80*08e51ae5SMike Rapoport (Microsoft) 
81*08e51ae5SMike Rapoport (Microsoft) static inline void thp_save_settings(void)
82*08e51ae5SMike Rapoport (Microsoft) {
83*08e51ae5SMike Rapoport (Microsoft) 	hugepage_save_settings(/* thp = */ true, /* hugetlb = */ false);
84*08e51ae5SMike Rapoport (Microsoft) }
8581afb1eeSMike Rapoport (Microsoft) 
8681afb1eeSMike Rapoport (Microsoft) void thp_set_read_ahead_path(char *path);
8781afb1eeSMike Rapoport (Microsoft) unsigned long thp_supported_orders(void);
8881afb1eeSMike Rapoport (Microsoft) unsigned long thp_shmem_supported_orders(void);
8981afb1eeSMike Rapoport (Microsoft) 
9081afb1eeSMike Rapoport (Microsoft) bool thp_available(void);
9181afb1eeSMike Rapoport (Microsoft) bool thp_is_enabled(void);
9281afb1eeSMike Rapoport (Microsoft) 
931bdc1698SMike Rapoport (Microsoft) /* HugeTLB */
941bdc1698SMike Rapoport (Microsoft) 
950020a1f5SMike Rapoport (Microsoft) int detect_hugetlb_page_sizes(unsigned long sizes[], int max);
961bdc1698SMike Rapoport (Microsoft) unsigned long default_huge_page_size(void);
971bdc1698SMike Rapoport (Microsoft) 
9827477b28SMike Rapoport (Microsoft) unsigned long hugetlb_nr_pages(unsigned long size);
9927477b28SMike Rapoport (Microsoft) void hugetlb_set_nr_pages(unsigned long size, unsigned long nr);
100024ec9a7SMike Rapoport (Microsoft) unsigned long hugetlb_free_pages(unsigned long size);
10127477b28SMike Rapoport (Microsoft) 
102*08e51ae5SMike Rapoport (Microsoft) static inline void hugetlb_save_settings(void)
103*08e51ae5SMike Rapoport (Microsoft) {
104*08e51ae5SMike Rapoport (Microsoft) 	hugepage_save_settings(/* thp = */ false, /* hugetlb = */ true);
105*08e51ae5SMike Rapoport (Microsoft) }
106*08e51ae5SMike Rapoport (Microsoft) 
107*08e51ae5SMike Rapoport (Microsoft) void hugetlb_restore_settings(void);
108*08e51ae5SMike Rapoport (Microsoft) 
10927477b28SMike Rapoport (Microsoft) static inline unsigned long hugetlb_nr_default_pages(void)
11027477b28SMike Rapoport (Microsoft) {
11127477b28SMike Rapoport (Microsoft) 	unsigned long size = default_huge_page_size();
11227477b28SMike Rapoport (Microsoft) 
11327477b28SMike Rapoport (Microsoft) 	if (!size)
11427477b28SMike Rapoport (Microsoft) 		return 0;
11527477b28SMike Rapoport (Microsoft) 
11627477b28SMike Rapoport (Microsoft) 	return hugetlb_nr_pages(size);
11727477b28SMike Rapoport (Microsoft) }
11827477b28SMike Rapoport (Microsoft) 
11927477b28SMike Rapoport (Microsoft) static inline void hugetlb_set_nr_default_pages(unsigned long nr)
12027477b28SMike Rapoport (Microsoft) {
12127477b28SMike Rapoport (Microsoft) 	unsigned long size = default_huge_page_size();
12227477b28SMike Rapoport (Microsoft) 
12327477b28SMike Rapoport (Microsoft) 	if (!size)
12427477b28SMike Rapoport (Microsoft) 		return;
12527477b28SMike Rapoport (Microsoft) 
12627477b28SMike Rapoport (Microsoft) 	hugetlb_set_nr_pages(size, nr);
12727477b28SMike Rapoport (Microsoft) }
12827477b28SMike Rapoport (Microsoft) 
129024ec9a7SMike Rapoport (Microsoft) static inline unsigned long hugetlb_free_default_pages(void)
130024ec9a7SMike Rapoport (Microsoft) {
131024ec9a7SMike Rapoport (Microsoft) 	unsigned long size = default_huge_page_size();
132024ec9a7SMike Rapoport (Microsoft) 
133024ec9a7SMike Rapoport (Microsoft) 	if (!size)
134024ec9a7SMike Rapoport (Microsoft) 		return 0;
135024ec9a7SMike Rapoport (Microsoft) 
136024ec9a7SMike Rapoport (Microsoft) 	return hugetlb_free_pages(size);
137024ec9a7SMike Rapoport (Microsoft) }
138024ec9a7SMike Rapoport (Microsoft) 
139*08e51ae5SMike Rapoport (Microsoft) static inline bool hugetlb_available(void)
140*08e51ae5SMike Rapoport (Microsoft) {
141*08e51ae5SMike Rapoport (Microsoft) 	return default_huge_page_size() != 0;
142*08e51ae5SMike Rapoport (Microsoft) }
143*08e51ae5SMike Rapoport (Microsoft) 
144*08e51ae5SMike Rapoport (Microsoft) bool hugetlb_setup_default(unsigned long nr);
145*08e51ae5SMike Rapoport (Microsoft) bool hugetlb_setup_default_exact(unsigned long nr);
146*08e51ae5SMike Rapoport (Microsoft) unsigned long hugetlb_setup(unsigned long nr, unsigned long sizes[],
147*08e51ae5SMike Rapoport (Microsoft) 			    int max);
148*08e51ae5SMike Rapoport (Microsoft) 
149*08e51ae5SMike Rapoport (Microsoft) #define HUGETLB_SETUP_DEFAULT_PAGES(nr_pages) \
150*08e51ae5SMike Rapoport (Microsoft) static void __attribute__((constructor)) __hugetlb_setup_default(void)	\
151*08e51ae5SMike Rapoport (Microsoft) {									\
152*08e51ae5SMike Rapoport (Microsoft) 	hugetlb_setup_default((nr_pages));				\
153*08e51ae5SMike Rapoport (Microsoft) }
154*08e51ae5SMike Rapoport (Microsoft) 
15581afb1eeSMike Rapoport (Microsoft) #endif /* __HUGEPAGE_SETTINGS_H__ */
156