page_ext.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __LINUX_PAGE_EXT_H
  3. #define __LINUX_PAGE_EXT_H
  4. #include <linux/types.h>
  5. #include <linux/stacktrace.h>
  6. #include <linux/stackdepot.h>
  7. struct pglist_data;
  8. struct page_ext_operations {
  9. size_t offset;
  10. size_t size;
  11. bool (*need)(void);
  12. void (*init)(void);
  13. };
  14. #ifdef CONFIG_PAGE_EXTENSION
  15. enum page_ext_flags {
  16. PAGE_EXT_OWNER,
  17. PAGE_EXT_OWNER_ALLOCATED,
  18. #if defined(CONFIG_PAGE_PINNER)
  19. /* page migration failed */
  20. PAGE_EXT_PINNER_MIGRATION_FAILED,
  21. #endif
  22. #if defined(CONFIG_PAGE_IDLE_FLAG) && !defined(CONFIG_64BIT)
  23. PAGE_EXT_YOUNG,
  24. PAGE_EXT_IDLE,
  25. #endif
  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. */
  34. struct page_ext {
  35. unsigned long flags;
  36. };
  37. extern bool early_page_ext;
  38. extern unsigned long page_ext_size;
  39. extern void pgdat_page_ext_init(struct pglist_data *pgdat);
  40. static inline bool early_page_ext_enabled(void)
  41. {
  42. return early_page_ext;
  43. }
  44. #ifdef CONFIG_SPARSEMEM
  45. static inline void page_ext_init_flatmem(void)
  46. {
  47. }
  48. extern void page_ext_init(void);
  49. static inline void page_ext_init_flatmem_late(void)
  50. {
  51. }
  52. #else
  53. extern void page_ext_init_flatmem(void);
  54. extern void page_ext_init_flatmem_late(void);
  55. static inline void page_ext_init(void)
  56. {
  57. }
  58. #endif
  59. extern struct page_ext *page_ext_get(struct page *page);
  60. extern void page_ext_put(struct page_ext *page_ext);
  61. static inline struct page_ext *page_ext_next(struct page_ext *curr)
  62. {
  63. void *next = curr;
  64. next += page_ext_size;
  65. return next;
  66. }
  67. #else /* !CONFIG_PAGE_EXTENSION */
  68. struct page_ext;
  69. static inline bool early_page_ext_enabled(void)
  70. {
  71. return false;
  72. }
  73. static inline void pgdat_page_ext_init(struct pglist_data *pgdat)
  74. {
  75. }
  76. static inline void page_ext_init(void)
  77. {
  78. }
  79. static inline void page_ext_init_flatmem_late(void)
  80. {
  81. }
  82. static inline void page_ext_init_flatmem(void)
  83. {
  84. }
  85. static inline struct page_ext *page_ext_get(struct page *page)
  86. {
  87. return NULL;
  88. }
  89. static inline void page_ext_put(struct page_ext *page_ext)
  90. {
  91. }
  92. #endif /* CONFIG_PAGE_EXTENSION */
  93. #endif /* __LINUX_PAGE_EXT_H */