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 unsigned long page_ext_size; 40 extern void pgdat_page_ext_init(struct pglist_data *pgdat); 41 42 #ifdef CONFIG_SPARSEMEM page_ext_init_flatmem(void)43static inline void page_ext_init_flatmem(void) 44 { 45 } 46 extern void page_ext_init(void); page_ext_init_flatmem_late(void)47static inline void page_ext_init_flatmem_late(void) 48 { 49 } 50 #else 51 extern void page_ext_init_flatmem(void); 52 extern void page_ext_init_flatmem_late(void); page_ext_init(void)53static inline void page_ext_init(void) 54 { 55 } 56 #endif 57 58 struct page_ext *lookup_page_ext(const struct page *page); 59 page_ext_next(struct page_ext * curr)60static inline struct page_ext *page_ext_next(struct page_ext *curr) 61 { 62 void *next = curr; 63 next += page_ext_size; 64 return next; 65 } 66 67 #else /* !CONFIG_PAGE_EXTENSION */ 68 struct page_ext; 69 pgdat_page_ext_init(struct pglist_data * pgdat)70static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 71 { 72 } 73 lookup_page_ext(const struct page * page)74static inline struct page_ext *lookup_page_ext(const struct page *page) 75 { 76 return NULL; 77 } 78 page_ext_init(void)79static inline void page_ext_init(void) 80 { 81 } 82 page_ext_init_flatmem_late(void)83static inline void page_ext_init_flatmem_late(void) 84 { 85 } 86 page_ext_init_flatmem(void)87static inline void page_ext_init_flatmem(void) 88 { 89 } 90 #endif /* CONFIG_PAGE_EXTENSION */ 91 #endif /* __LINUX_PAGE_EXT_H */ 92