| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef __HUGEPAGE_SETTINGS_H__ | |
| #define __HUGEPAGE_SETTINGS_H__ | |
| #include <stdbool.h> | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| void hugepage_save_settings(bool thp, bool hugetlb); | |
| /* Transparent Huge Pages (THP) */ | |
| enum thp_enabled { | |
| THP_NEVER, | |
| THP_ALWAYS, | |
| THP_INHERIT, | |
| THP_MADVISE, | |
| }; | |
| enum thp_defrag { | |
| THP_DEFRAG_ALWAYS, | |
| THP_DEFRAG_DEFER, | |
| THP_DEFRAG_DEFER_MADVISE, | |
| THP_DEFRAG_MADVISE, | |
| THP_DEFRAG_NEVER, | |
| }; | |
| enum shmem_enabled { | |
| SHMEM_NEVER, | |
| SHMEM_ALWAYS, | |
| SHMEM_WITHIN_SIZE, | |
| SHMEM_ADVISE, | |
| SHMEM_INHERIT, | |
| SHMEM_DENY, | |
| SHMEM_FORCE, | |
| }; | |
| #define NR_ORDERS 20 | |
| struct hugepages_settings { | |
| enum thp_enabled enabled; | |
| }; | |
| struct khugepaged_settings { | |
| bool defrag; | |
| unsigned int alloc_sleep_millisecs; | |
| unsigned int scan_sleep_millisecs; | |
| unsigned int max_ptes_none; | |
| unsigned int max_ptes_swap; | |
| unsigned int max_ptes_shared; | |
| unsigned long pages_to_scan; | |
| }; | |
| struct shmem_hugepages_settings { | |
| enum shmem_enabled enabled; | |
| }; | |
| struct thp_settings { | |
| enum thp_enabled thp_enabled; | |
| enum thp_defrag thp_defrag; | |
| enum shmem_enabled shmem_enabled; | |
| bool use_zero_page; | |
| struct khugepaged_settings khugepaged; | |
| unsigned long read_ahead_kb; | |
| struct hugepages_settings hugepages[NR_ORDERS]; | |
| struct shmem_hugepages_settings shmem_hugepages[NR_ORDERS]; | |
| }; | |
| int thp_read_string(const char *name, const char * const strings[]); | |
| void thp_write_string(const char *name, const char *val); | |
| unsigned long thp_read_num(const char *name); | |
| void thp_write_num(const char *name, unsigned long num); | |
| void thp_write_settings(struct thp_settings *settings); | |
| void thp_read_settings(struct thp_settings *settings); | |
| struct thp_settings *thp_current_settings(void); | |
| void thp_push_settings(struct thp_settings *settings); | |
| void thp_pop_settings(void); | |
| void thp_restore_settings(void); | |
| static inline void thp_save_settings(void) | |
| { | |
| hugepage_save_settings(/* thp = */ true, /* hugetlb = */ false); | |
| } | |
| void thp_set_read_ahead_path(char *path); | |
| unsigned long thp_supported_orders(void); | |
| unsigned long thp_shmem_supported_orders(void); | |
| bool thp_available(void); | |
| bool thp_is_enabled(void); | |
| /* HugeTLB */ | |
| int detect_hugetlb_page_sizes(unsigned long sizes[], int max); | |
| unsigned long default_huge_page_size(void); | |
| unsigned long hugetlb_nr_pages(unsigned long size); | |
| void hugetlb_set_nr_pages(unsigned long size, unsigned long nr); | |
| unsigned long hugetlb_free_pages(unsigned long size); | |
| static inline void hugetlb_save_settings(void) | |
| { | |
| hugepage_save_settings(/* thp = */ false, /* hugetlb = */ true); | |
| } | |
| void hugetlb_restore_settings(void); | |
| static inline unsigned long hugetlb_nr_default_pages(void) | |
| { | |
| unsigned long size = default_huge_page_size(); | |
| if (!size) | |
| return 0; | |
| return hugetlb_nr_pages(size); | |
| } | |
| static inline void hugetlb_set_nr_default_pages(unsigned long nr) | |
| { | |
| unsigned long size = default_huge_page_size(); | |
| if (!size) | |
| return; | |
| hugetlb_set_nr_pages(size, nr); | |
| } | |
| static inline unsigned long hugetlb_free_default_pages(void) | |
| { | |
| unsigned long size = default_huge_page_size(); | |
| if (!size) | |
| return 0; | |
| return hugetlb_free_pages(size); | |
| } | |
| static inline bool hugetlb_available(void) | |
| { | |
| return default_huge_page_size() != 0; | |
| } | |
| bool hugetlb_setup_default(unsigned long nr); | |
| bool hugetlb_setup_default_exact(unsigned long nr); | |
| unsigned long hugetlb_setup(unsigned long nr, unsigned long sizes[], | |
| int max); | |
| #define HUGETLB_SETUP_DEFAULT_PAGES(nr_pages) \ | |
| static void __attribute__((constructor)) __hugetlb_setup_default(void) \ | |
| { \ | |
| hugetlb_setup_default((nr_pages)); \ | |
| } | |
| #endif /* __HUGEPAGE_SETTINGS_H__ */ |