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        PAGE_EXT_OWNER_ALLOCATED,
  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 unsigned long page_ext_size;
  40extern void pgdat_page_ext_init(struct pglist_data *pgdat);
  41
  42#ifdef CONFIG_SPARSEMEM
  43static inline void page_ext_init_flatmem(void)
  44{
  45}
  46extern void page_ext_init(void);
  47#else
  48extern void page_ext_init_flatmem(void);
  49static inline void page_ext_init(void)
  50{
  51}
  52#endif
  53
  54struct page_ext *lookup_page_ext(const struct page *page);
  55
  56static inline struct page_ext *page_ext_next(struct page_ext *curr)
  57{
  58        void *next = curr;
  59        next += page_ext_size;
  60        return next;
  61}
  62
  63#else /* !CONFIG_PAGE_EXTENSION */
  64struct page_ext;
  65
  66static inline void pgdat_page_ext_init(struct pglist_data *pgdat)
  67{
  68}
  69
  70static inline struct page_ext *lookup_page_ext(const struct page *page)
  71{
  72        return NULL;
  73}
  74
  75static inline void page_ext_init(void)
  76{
  77}
  78
  79static inline void page_ext_init_flatmem(void)
  80{
  81}
  82#endif /* CONFIG_PAGE_EXTENSION */
  83#endif /* __LINUX_PAGE_EXT_H */
  84