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