page_idle.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. #ifdef CONFIG_64BIT
  9. static inline bool page_is_young(struct page *page)
  10. {
  11. return PageYoung(page);
  12. }
  13. static inline void set_page_young(struct page *page)
  14. {
  15. SetPageYoung(page);
  16. }
  17. static inline bool test_and_clear_page_young(struct page *page)
  18. {
  19. return TestClearPageYoung(page);
  20. }
  21. static inline bool page_is_idle(struct page *page)
  22. {
  23. return PageIdle(page);
  24. }
  25. static inline void set_page_idle(struct page *page)
  26. {
  27. SetPageIdle(page);
  28. }
  29. static inline void clear_page_idle(struct page *page)
  30. {
  31. ClearPageIdle(page);
  32. }
  33. #else /* !CONFIG_64BIT */
  34. /*
  35. * If there is not enough space to store Idle and Young bits in page flags, use
  36. * page ext flags instead.
  37. */
  38. extern struct page_ext_operations page_idle_ops;
  39. static inline bool page_is_young(struct page *page)
  40. {
  41. struct page_ext *page_ext = page_ext_get(page);
  42. bool page_young;
  43. if (unlikely(!page_ext))
  44. return false;
  45. page_young = test_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  46. page_ext_put(page_ext);
  47. return page_young;
  48. }
  49. static inline void set_page_young(struct page *page)
  50. {
  51. struct page_ext *page_ext = page_ext_get(page);
  52. if (unlikely(!page_ext))
  53. return;
  54. set_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  55. page_ext_put(page_ext);
  56. }
  57. static inline bool test_and_clear_page_young(struct page *page)
  58. {
  59. struct page_ext *page_ext = page_ext_get(page);
  60. bool page_young;
  61. if (unlikely(!page_ext))
  62. return false;
  63. page_young = test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  64. page_ext_put(page_ext);
  65. return page_young;
  66. }
  67. static inline bool page_is_idle(struct page *page)
  68. {
  69. struct page_ext *page_ext = page_ext_get(page);
  70. bool page_idle;
  71. if (unlikely(!page_ext))
  72. return false;
  73. page_idle = test_bit(PAGE_EXT_IDLE, &page_ext->flags);
  74. page_ext_put(page_ext);
  75. return page_idle;
  76. }
  77. static inline void set_page_idle(struct page *page)
  78. {
  79. struct page_ext *page_ext = page_ext_get(page);
  80. if (unlikely(!page_ext))
  81. return;
  82. set_bit(PAGE_EXT_IDLE, &page_ext->flags);
  83. page_ext_put(page_ext);
  84. }
  85. static inline void clear_page_idle(struct page *page)
  86. {
  87. struct page_ext *page_ext = page_ext_get(page);
  88. if (unlikely(!page_ext))
  89. return;
  90. clear_bit(PAGE_EXT_IDLE, &page_ext->flags);
  91. page_ext_put(page_ext);
  92. }
  93. #endif /* CONFIG_64BIT */
  94. #else /* !CONFIG_PAGE_IDLE_FLAG */
  95. static inline bool page_is_young(struct page *page)
  96. {
  97. return false;
  98. }
  99. static inline void set_page_young(struct page *page)
  100. {
  101. }
  102. static inline bool test_and_clear_page_young(struct page *page)
  103. {
  104. return false;
  105. }
  106. static inline bool page_is_idle(struct page *page)
  107. {
  108. return false;
  109. }
  110. static inline void set_page_idle(struct page *page)
  111. {
  112. }
  113. static inline void clear_page_idle(struct page *page)
  114. {
  115. }
  116. #endif /* CONFIG_PAGE_IDLE_FLAG */
  117. #endif /* _LINUX_MM_PAGE_IDLE_H */