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_PINNER) 23 /* page migration failed */ 24 PAGE_EXT_PINNER_MIGRATION_FAILED, 25 #endif 26 #if defined(CONFIG_PAGE_IDLE_FLAG) && !defined(CONFIG_64BIT) 27 PAGE_EXT_YOUNG, 28 PAGE_EXT_IDLE, 29 #endif 30 }; 31 32 /* 33 * Page Extension can be considered as an extended mem_map. 34 * A page_ext page is associated with every page descriptor. The 35 * page_ext helps us add more information about the page. 36 * All page_ext are allocated at boot or memory hotplug event, 37 * then the page_ext for pfn always exists. 38 */ 39 struct page_ext { 40 unsigned long flags; 41 }; 42 43 extern unsigned long page_ext_size; 44 extern void pgdat_page_ext_init(struct pglist_data *pgdat); 45 46 #ifdef CONFIG_SPARSEMEM page_ext_init_flatmem(void)47static inline void page_ext_init_flatmem(void) 48 { 49 } 50 extern void page_ext_init(void); page_ext_init_flatmem_late(void)51static inline void page_ext_init_flatmem_late(void) 52 { 53 } 54 #else 55 extern void page_ext_init_flatmem(void); 56 extern void page_ext_init_flatmem_late(void); page_ext_init(void)57static inline void page_ext_init(void) 58 { 59 } 60 #endif 61 struct page_ext *lookup_page_ext(const struct page *page); 62 extern struct page_ext *page_ext_get(struct page *page); 63 extern void page_ext_put(struct page_ext *page_ext); 64 page_ext_next(struct page_ext * curr)65static inline struct page_ext *page_ext_next(struct page_ext *curr) 66 { 67 void *next = curr; 68 next += page_ext_size; 69 return next; 70 } 71 72 #else /* !CONFIG_PAGE_EXTENSION */ 73 struct page_ext; 74 pgdat_page_ext_init(struct pglist_data * pgdat)75static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 76 { 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 page_ext_get(struct page * page)91static inline struct page_ext *page_ext_get(struct page *page) 92 { 93 return NULL; 94 } 95 page_ext_put(struct page_ext * page_ext)96static inline void page_ext_put(struct page_ext *page_ext) 97 { 98 } 99 #endif /* CONFIG_PAGE_EXTENSION */ 100 #endif /* __LINUX_PAGE_EXT_H */ 101