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 19/* 20 * page_ext->flags bits: 21 * 22 * PAGE_EXT_DEBUG_POISON is set for poisoned pages. This is used to 23 * implement generic debug pagealloc feature. The pages are filled with 24 * poison patterns and set this flag after free_pages(). The poisoned 25 * pages are verified whether the patterns are not corrupted and clear 26 * the flag before alloc_pages(). 27 */ 28 29enum page_ext_flags { 30 PAGE_EXT_DEBUG_POISON, /* Page is poisoned */ 31 PAGE_EXT_DEBUG_GUARD, 32 PAGE_EXT_OWNER, 33#if defined(CONFIG_IDLE_PAGE_TRACKING) && !defined(CONFIG_64BIT) 34 PAGE_EXT_YOUNG, 35 PAGE_EXT_IDLE, 36#endif 37}; 38 39/* 40 * Page Extension can be considered as an extended mem_map. 41 * A page_ext page is associated with every page descriptor. The 42 * page_ext helps us add more information about the page. 43 * All page_ext are allocated at boot or memory hotplug event, 44 * then the page_ext for pfn always exists. 45 */ 46struct page_ext { 47 unsigned long flags; 48}; 49 50extern void pgdat_page_ext_init(struct pglist_data *pgdat); 51 52#ifdef CONFIG_SPARSEMEM 53static inline void page_ext_init_flatmem(void) 54{ 55} 56extern void page_ext_init(void); 57#else 58extern void page_ext_init_flatmem(void); 59static inline void page_ext_init(void) 60{ 61} 62#endif 63 64struct page_ext *lookup_page_ext(struct page *page); 65 66#else /* !CONFIG_PAGE_EXTENSION */ 67struct page_ext; 68 69static inline void pgdat_page_ext_init(struct pglist_data *pgdat) 70{ 71} 72 73static inline struct page_ext *lookup_page_ext(struct page *page) 74{ 75 return NULL; 76} 77 78static inline void page_ext_init(void) 79{ 80} 81 82static inline void page_ext_init_flatmem(void) 83{ 84} 85#endif /* CONFIG_PAGE_EXTENSION */ 86#endif /* __LINUX_PAGE_EXT_H */ 87