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
  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