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_PAGE_IDLE_FLAG) && !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);
  47static inline void page_ext_init_flatmem_late(void)
  48{
  49}
  50#else
  51extern void page_ext_init_flatmem(void);
  52extern void page_ext_init_flatmem_late(void);
  53static inline void page_ext_init(void)
  54{
  55}
  56#endif
  57
  58struct page_ext *lookup_page_ext(const struct page *page);
  59
  60static inline struct page_ext *page_ext_next(struct page_ext *curr)
  61{
  62        void *next = curr;
  63        next += page_ext_size;
  64        return next;
  65}
  66
  67#else /* !CONFIG_PAGE_EXTENSION */
  68struct page_ext;
  69
  70static inline void pgdat_page_ext_init(struct pglist_data *pgdat)
  71{
  72}
  73
  74static inline struct page_ext *lookup_page_ext(const struct page *page)
  75{
  76        return NULL;
  77}
  78
  79static inline void page_ext_init(void)
  80{
  81}
  82
  83static inline void page_ext_init_flatmem_late(void)
  84{
  85}
  86
  87static inline void page_ext_init_flatmem(void)
  88{
  89}
  90#endif /* CONFIG_PAGE_EXTENSION */
  91#endif /* __LINUX_PAGE_EXT_H */
  92