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_DEBUG_GUARD, 21 PAGE_EXT_OWNER, 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 */ 35struct page_ext { 36 unsigned long flags; 37}; 38 39extern void pgdat_page_ext_init(struct pglist_data *pgdat); 40 41#ifdef CONFIG_SPARSEMEM 42static inline void page_ext_init_flatmem(void) 43{ 44} 45extern void page_ext_init(void); 46#else 47extern void page_ext_init_flatmem(void); 48static inline void page_ext_init(void) 49{ 50} 51#endif 52 53struct page_ext *lookup_page_ext(const struct page *page); 54 55#else /* !CONFIG_PAGE_EXTENSION */ 56struct page_ext; 57 58static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 59{ 60} 61 62static inline struct page_ext *lookup_page_ext(const struct page *page) 63{ 64 return NULL; 65} 66 67static inline void page_ext_init(void) 68{ 69} 70 71static inline void page_ext_init_flatmem(void) 72{ 73} 74#endif /* CONFIG_PAGE_EXTENSION */ 75#endif /* __LINUX_PAGE_EXT_H */ 76