at v6.1 2.2 kB view raw
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 9struct pglist_data; 10struct 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 19enum page_ext_flags { 20 PAGE_EXT_OWNER, 21 PAGE_EXT_OWNER_ALLOCATED, 22#if defined(CONFIG_PAGE_IDLE_FLAG) && !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 */ 35struct page_ext { 36 unsigned long flags; 37}; 38 39extern bool early_page_ext; 40extern unsigned long page_ext_size; 41extern void pgdat_page_ext_init(struct pglist_data *pgdat); 42 43static inline bool early_page_ext_enabled(void) 44{ 45 return early_page_ext; 46} 47 48#ifdef CONFIG_SPARSEMEM 49static inline void page_ext_init_flatmem(void) 50{ 51} 52extern void page_ext_init(void); 53static inline void page_ext_init_flatmem_late(void) 54{ 55} 56#else 57extern void page_ext_init_flatmem(void); 58extern void page_ext_init_flatmem_late(void); 59static inline void page_ext_init(void) 60{ 61} 62#endif 63 64extern struct page_ext *page_ext_get(struct page *page); 65extern void page_ext_put(struct page_ext *page_ext); 66 67static inline struct page_ext *page_ext_next(struct page_ext *curr) 68{ 69 void *next = curr; 70 next += page_ext_size; 71 return next; 72} 73 74#else /* !CONFIG_PAGE_EXTENSION */ 75struct page_ext; 76 77static inline bool early_page_ext_enabled(void) 78{ 79 return false; 80} 81 82static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 83{ 84} 85 86static inline void page_ext_init(void) 87{ 88} 89 90static inline void page_ext_init_flatmem_late(void) 91{ 92} 93 94static inline void page_ext_init_flatmem(void) 95{ 96} 97 98static inline struct page_ext *page_ext_get(struct page *page) 99{ 100 return NULL; 101} 102 103static inline void page_ext_put(struct page_ext *page_ext) 104{ 105} 106#endif /* CONFIG_PAGE_EXTENSION */ 107#endif /* __LINUX_PAGE_EXT_H */