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