page_idle.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _LINUX_MM_PAGE_IDLE_H
  3. #define _LINUX_MM_PAGE_IDLE_H
  4. #include <linux/bitops.h>
  5. #include <linux/page-flags.h>
  6. #include <linux/page_ext.h>
  7. #ifdef CONFIG_PAGE_IDLE_FLAG
  8. #ifndef CONFIG_64BIT
  9. /*
  10. * If there is not enough space to store Idle and Young bits in page flags, use
  11. * page ext flags instead.
  12. */
  13. static inline bool folio_test_young(struct folio *folio)
  14. {
  15. struct page_ext *page_ext = page_ext_get(&folio->page);
  16. bool page_young;
  17. if (unlikely(!page_ext))
  18. return false;
  19. page_young = test_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  20. page_ext_put(page_ext);
  21. return page_young;
  22. }
  23. static inline void folio_set_young(struct folio *folio)
  24. {
  25. struct page_ext *page_ext = page_ext_get(&folio->page);
  26. if (unlikely(!page_ext))
  27. return;
  28. set_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  29. page_ext_put(page_ext);
  30. }
  31. static inline bool folio_test_clear_young(struct folio *folio)
  32. {
  33. struct page_ext *page_ext = page_ext_get(&folio->page);
  34. bool page_young;
  35. if (unlikely(!page_ext))
  36. return false;
  37. page_young = test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  38. page_ext_put(page_ext);
  39. return page_young;
  40. }
  41. static inline bool folio_test_idle(struct folio *folio)
  42. {
  43. struct page_ext *page_ext = page_ext_get(&folio->page);
  44. bool page_idle;
  45. if (unlikely(!page_ext))
  46. return false;
  47. page_idle = test_bit(PAGE_EXT_IDLE, &page_ext->flags);
  48. page_ext_put(page_ext);
  49. return page_idle;
  50. }
  51. static inline void folio_set_idle(struct folio *folio)
  52. {
  53. struct page_ext *page_ext = page_ext_get(&folio->page);
  54. if (unlikely(!page_ext))
  55. return;
  56. set_bit(PAGE_EXT_IDLE, &page_ext->flags);
  57. page_ext_put(page_ext);
  58. }
  59. static inline void folio_clear_idle(struct folio *folio)
  60. {
  61. struct page_ext *page_ext = page_ext_get(&folio->page);
  62. if (unlikely(!page_ext))
  63. return;
  64. clear_bit(PAGE_EXT_IDLE, &page_ext->flags);
  65. page_ext_put(page_ext);
  66. }
  67. #endif /* !CONFIG_64BIT */
  68. #else /* !CONFIG_PAGE_IDLE_FLAG */
  69. static inline bool folio_test_young(struct folio *folio)
  70. {
  71. return false;
  72. }
  73. static inline void folio_set_young(struct folio *folio)
  74. {
  75. }
  76. static inline bool folio_test_clear_young(struct folio *folio)
  77. {
  78. return false;
  79. }
  80. static inline bool folio_test_idle(struct folio *folio)
  81. {
  82. return false;
  83. }
  84. static inline void folio_set_idle(struct folio *folio)
  85. {
  86. }
  87. static inline void folio_clear_idle(struct folio *folio)
  88. {
  89. }
  90. #endif /* CONFIG_PAGE_IDLE_FLAG */
  91. static inline bool page_is_young(struct page *page)
  92. {
  93. return folio_test_young(page_folio(page));
  94. }
  95. static inline void set_page_young(struct page *page)
  96. {
  97. folio_set_young(page_folio(page));
  98. }
  99. static inline bool test_and_clear_page_young(struct page *page)
  100. {
  101. return folio_test_clear_young(page_folio(page));
  102. }
  103. static inline bool page_is_idle(struct page *page)
  104. {
  105. return folio_test_idle(page_folio(page));
  106. }
  107. static inline void set_page_idle(struct page *page)
  108. {
  109. folio_set_idle(page_folio(page));
  110. }
  111. static inline void clear_page_idle(struct page *page)
  112. {
  113. folio_clear_idle(page_folio(page));
  114. }
  115. #endif /* _LINUX_MM_PAGE_IDLE_H */