page_ext.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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_DEBUG_GUARD,
  17. PAGE_EXT_OWNER,
  18. #if defined(CONFIG_IDLE_PAGE_TRACKING) && !defined(CONFIG_64BIT)
  19. PAGE_EXT_YOUNG,
  20. PAGE_EXT_IDLE,
  21. #endif
  22. };
  23. /*
  24. * Page Extension can be considered as an extended mem_map.
  25. * A page_ext page is associated with every page descriptor. The
  26. * page_ext helps us add more information about the page.
  27. * All page_ext are allocated at boot or memory hotplug event,
  28. * then the page_ext for pfn always exists.
  29. */
  30. struct page_ext {
  31. unsigned long flags;
  32. };
  33. extern void pgdat_page_ext_init(struct pglist_data *pgdat);
  34. #ifdef CONFIG_SPARSEMEM
  35. static inline void page_ext_init_flatmem(void)
  36. {
  37. }
  38. extern void page_ext_init(void);
  39. #else
  40. extern void page_ext_init_flatmem(void);
  41. static inline void page_ext_init(void)
  42. {
  43. }
  44. #endif
  45. struct page_ext *lookup_page_ext(struct page *page);
  46. #else /* !CONFIG_PAGE_EXTENSION */
  47. struct page_ext;
  48. static inline void pgdat_page_ext_init(struct pglist_data *pgdat)
  49. {
  50. }
  51. static inline struct page_ext *lookup_page_ext(struct page *page)
  52. {
  53. return NULL;
  54. }
  55. static inline void page_ext_init(void)
  56. {
  57. }
  58. static inline void page_ext_init_flatmem(void)
  59. {
  60. }
  61. #endif /* CONFIG_PAGE_EXTENSION */
  62. #endif /* __LINUX_PAGE_EXT_H */