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#if defined(CONFIG_IDLE_PAGE_TRACKING) && !defined(CONFIG_64BIT) 22 PAGE_EXT_YOUNG, 23 PAGE_EXT_IDLE, 24#endif 25}; 26 27/* 28 * Page Extension can be considered as an extended mem_map. 29 * A page_ext page is associated with every page descriptor. The 30 * page_ext helps us add more information about the page. 31 * All page_ext are allocated at boot or memory hotplug event, 32 * then the page_ext for pfn always exists. 33 */ 34struct page_ext { 35 unsigned long flags; 36}; 37 38extern void pgdat_page_ext_init(struct pglist_data *pgdat); 39 40#ifdef CONFIG_SPARSEMEM 41static inline void page_ext_init_flatmem(void) 42{ 43} 44extern void page_ext_init(void); 45#else 46extern void page_ext_init_flatmem(void); 47static inline void page_ext_init(void) 48{ 49} 50#endif 51 52struct page_ext *lookup_page_ext(const struct page *page); 53 54#else /* !CONFIG_PAGE_EXTENSION */ 55struct page_ext; 56 57static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 58{ 59} 60 61static inline struct page_ext *lookup_page_ext(const struct page *page) 62{ 63 return NULL; 64} 65 66static inline void page_ext_init(void) 67{ 68} 69 70static inline void page_ext_init_flatmem(void) 71{ 72} 73#endif /* CONFIG_PAGE_EXTENSION */ 74#endif /* __LINUX_PAGE_EXT_H */ 75