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 bool early_page_ext; 44 extern unsigned long page_ext_size; 45 extern void pgdat_page_ext_init(struct pglist_data *pgdat); 46 early_page_ext_enabled(void)47static inline bool early_page_ext_enabled(void) 48 { 49 return early_page_ext; 50 } 51 52 #ifdef CONFIG_SPARSEMEM page_ext_init_flatmem(void)53static inline void page_ext_init_flatmem(void) 54 { 55 } 56 extern void page_ext_init(void); page_ext_init_flatmem_late(void)57static inline void page_ext_init_flatmem_late(void) 58 { 59 } 60 #else 61 extern void page_ext_init_flatmem(void); 62 extern void page_ext_init_flatmem_late(void); page_ext_init(void)63static inline void page_ext_init(void) 64 { 65 } 66 #endif 67 68 extern struct page_ext *page_ext_get(struct page *page); 69 extern void page_ext_put(struct page_ext *page_ext); 70 page_ext_next(struct page_ext * curr)71static inline struct page_ext *page_ext_next(struct page_ext *curr) 72 { 73 void *next = curr; 74 next += page_ext_size; 75 return next; 76 } 77 78 #else /* !CONFIG_PAGE_EXTENSION */ 79 struct page_ext; 80 early_page_ext_enabled(void)81static inline bool early_page_ext_enabled(void) 82 { 83 return false; 84 } 85 pgdat_page_ext_init(struct pglist_data * pgdat)86static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 87 { 88 } 89 page_ext_init(void)90static inline void page_ext_init(void) 91 { 92 } 93 page_ext_init_flatmem_late(void)94static inline void page_ext_init_flatmem_late(void) 95 { 96 } 97 page_ext_init_flatmem(void)98static inline void page_ext_init_flatmem(void) 99 { 100 } 101 page_ext_get(struct page * page)102static inline struct page_ext *page_ext_get(struct page *page) 103 { 104 return NULL; 105 } 106 page_ext_put(struct page_ext * page_ext)107static inline void page_ext_put(struct page_ext *page_ext) 108 { 109 } 110 #endif /* CONFIG_PAGE_EXTENSION */ 111 #endif /* __LINUX_PAGE_EXT_H */ 112