linux/include/linux/page_ext.h
<<
>>
Prefs
   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