Branch data 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 : : #else 48 : : extern void page_ext_init_flatmem(void); 49 : : static inline void page_ext_init(void) 50 : : { 51 : : } 52 : : #endif 53 : : 54 : : struct page_ext *lookup_page_ext(const struct page *page); 55 : : 56 : : static inline struct page_ext *page_ext_next(struct page_ext *curr) 57 : : { 58 : : void *next = curr; 59 : : next += page_ext_size; 60 : : return next; 61 : : } 62 : : 63 : : #else /* !CONFIG_PAGE_EXTENSION */ 64 : : struct page_ext; 65 : : 66 : 13 : static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 67 : : { 68 : 13 : } 69 : : 70 : : static inline struct page_ext *lookup_page_ext(const struct page *page) 71 : : { 72 : : return NULL; 73 : : } 74 : : 75 : 13 : static inline void page_ext_init(void) 76 : : { 77 : 13 : } 78 : : 79 : 13 : static inline void page_ext_init_flatmem(void) 80 : : { 81 : 13 : } 82 : : #endif /* CONFIG_PAGE_EXTENSION */ 83 : : #endif /* __LINUX_PAGE_EXT_H */