Line data Source code
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_IDLE_PAGE_TRACKING) && !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 43 : static inline void page_ext_init_flatmem(void) 44 : { 45 : } 46 : extern void page_ext_init(void); 47 : static 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); 53 : static inline void page_ext_init(void) 54 : { 55 : } 56 : #endif 57 : 58 : struct page_ext *lookup_page_ext(const struct page *page); 59 : 60 : static 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 : 70 1 : static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 71 : { 72 1 : } 73 : 74 : static inline struct page_ext *lookup_page_ext(const struct page *page) 75 : { 76 : return NULL; 77 : } 78 : 79 1 : static inline void page_ext_init(void) 80 : { 81 1 : } 82 : 83 1 : static inline void page_ext_init_flatmem_late(void) 84 : { 85 1 : } 86 : 87 1 : static inline void page_ext_init_flatmem(void) 88 : { 89 1 : } 90 : #endif /* CONFIG_PAGE_EXTENSION */ 91 : #endif /* __LINUX_PAGE_EXT_H */