1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __LINUX_PAGE_EXT_H 3 #define __LINUX_PAGE_EXT_H 4 5 #include <linux/types.h> 6 #include <linux/stacktrace.h> 7 #include <linux/stackdepot.h> 8 9 struct pglist_data; 10 struct page_ext_operations { 11 size_t offset; 12 size_t size; 13 bool (*need)(void); 14 void (*init)(void); 15 }; 16 17 #ifdef CONFIG_PAGE_EXTENSION 18 19 enum page_ext_flags { 20 PAGE_EXT_OWNER, 21 PAGE_EXT_OWNER_ALLOCATED, 22 #if defined(CONFIG_PAGE_IDLE_FLAG) && !defined(CONFIG_64BIT) 23 PAGE_EXT_YOUNG, 24 PAGE_EXT_IDLE, 25 #endif 26 }; 27 28 /* 29 * Page Extension can be considered as an extended mem_map. 30 * A page_ext page is associated with every page descriptor. The 31 * page_ext helps us add more information about the page. 32 * All page_ext are allocated at boot or memory hotplug event, 33 * then the page_ext for pfn always exists. 34 */ 35 struct page_ext { 36 unsigned long flags; 37 }; 38 39 extern bool early_page_ext; 40 extern unsigned long page_ext_size; 41 extern void pgdat_page_ext_init(struct pglist_data *pgdat); 42 early_page_ext_enabled(void)43static inline bool early_page_ext_enabled(void) 44 { 45 return early_page_ext; 46 } 47 48 #ifdef CONFIG_SPARSEMEM page_ext_init_flatmem(void)49static inline void page_ext_init_flatmem(void) 50 { 51 } 52 extern void page_ext_init(void); page_ext_init_flatmem_late(void)53static inline void page_ext_init_flatmem_late(void) 54 { 55 } 56 #else 57 extern void page_ext_init_flatmem(void); 58 extern void page_ext_init_flatmem_late(void); page_ext_init(void)59static inline void page_ext_init(void) 60 { 61 } 62 #endif 63 64 extern struct page_ext *page_ext_get(struct page *page); 65 extern void page_ext_put(struct page_ext *page_ext); 66 page_ext_next(struct page_ext * curr)67static inline struct page_ext *page_ext_next(struct page_ext *curr) 68 { 69 void *next = curr; 70 next += page_ext_size; 71 return next; 72 } 73 74 #else /* !CONFIG_PAGE_EXTENSION */ 75 struct page_ext; 76 early_page_ext_enabled(void)77static inline bool early_page_ext_enabled(void) 78 { 79 return false; 80 } 81 pgdat_page_ext_init(struct pglist_data * pgdat)82static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 83 { 84 } 85 page_ext_init(void)86static inline void page_ext_init(void) 87 { 88 } 89 page_ext_init_flatmem_late(void)90static inline void page_ext_init_flatmem_late(void) 91 { 92 } 93 page_ext_init_flatmem(void)94static inline void page_ext_init_flatmem(void) 95 { 96 } 97 page_ext_get(struct page * page)98static inline struct page_ext *page_ext_get(struct page *page) 99 { 100 return NULL; 101 } 102 page_ext_put(struct page_ext * page_ext)103static inline void page_ext_put(struct page_ext *page_ext) 104 { 105 } 106 #endif /* CONFIG_PAGE_EXTENSION */ 107 #endif /* __LINUX_PAGE_EXT_H */ 108