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