1 #ifndef __LINUX_PAGE_EXT_H 2 #define __LINUX_PAGE_EXT_H 3 4 #include <linux/types.h> 5 #include <linux/stacktrace.h> 6 #include <linux/stackdepot.h> 7 8 struct pglist_data; 9 struct page_ext_operations { 10 size_t offset; 11 size_t size; 12 bool (*need)(void); 13 void (*init)(void); 14 }; 15 16 #ifdef CONFIG_PAGE_EXTENSION 17 18 /* 19 * page_ext->flags bits: 20 * 21 * PAGE_EXT_DEBUG_POISON is set for poisoned pages. This is used to 22 * implement generic debug pagealloc feature. The pages are filled with 23 * poison patterns and set this flag after free_pages(). The poisoned 24 * pages are verified whether the patterns are not corrupted and clear 25 * the flag before alloc_pages(). 26 */ 27 28 enum page_ext_flags { 29 PAGE_EXT_DEBUG_POISON, /* Page is poisoned */ 30 PAGE_EXT_DEBUG_GUARD, 31 PAGE_EXT_OWNER, 32 #if defined(CONFIG_IDLE_PAGE_TRACKING) && !defined(CONFIG_64BIT) 33 PAGE_EXT_YOUNG, 34 PAGE_EXT_IDLE, 35 #endif 36 }; 37 38 /* 39 * Page Extension can be considered as an extended mem_map. 40 * A page_ext page is associated with every page descriptor. The 41 * page_ext helps us add more information about the page. 42 * All page_ext are allocated at boot or memory hotplug event, 43 * then the page_ext for pfn always exists. 44 */ 45 struct page_ext { 46 unsigned long flags; 47 }; 48 49 extern void pgdat_page_ext_init(struct pglist_data *pgdat); 50 51 #ifdef CONFIG_SPARSEMEM page_ext_init_flatmem(void)52static inline void page_ext_init_flatmem(void) 53 { 54 } 55 extern void page_ext_init(void); 56 #else 57 extern void page_ext_init_flatmem(void); page_ext_init(void)58static inline void page_ext_init(void) 59 { 60 } 61 #endif 62 63 struct page_ext *lookup_page_ext(struct page *page); 64 65 #else /* !CONFIG_PAGE_EXTENSION */ 66 struct page_ext; 67 pgdat_page_ext_init(struct pglist_data * pgdat)68static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 69 { 70 } 71 lookup_page_ext(struct page * page)72static inline struct page_ext *lookup_page_ext(struct page *page) 73 { 74 return NULL; 75 } 76 page_ext_init(void)77static inline void page_ext_init(void) 78 { 79 } 80 page_ext_init_flatmem(void)81static inline void page_ext_init_flatmem(void) 82 { 83 } 84 #endif /* CONFIG_PAGE_EXTENSION */ 85 #endif /* __LINUX_PAGE_EXT_H */ 86