page_idle.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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 = lookup_page_ext(page);
  42. if (unlikely(!page_ext))
  43. return false;
  44. return test_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  45. }
  46. static inline void set_page_young(struct page *page)
  47. {
  48. struct page_ext *page_ext = lookup_page_ext(page);
  49. if (unlikely(!page_ext))
  50. return;
  51. set_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  52. }
  53. static inline bool test_and_clear_page_young(struct page *page)
  54. {
  55. struct page_ext *page_ext = lookup_page_ext(page);
  56. if (unlikely(!page_ext))
  57. return false;
  58. return test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags);
  59. }
  60. static inline bool page_is_idle(struct page *page)
  61. {
  62. struct page_ext *page_ext = lookup_page_ext(page);
  63. if (unlikely(!page_ext))
  64. return false;
  65. return test_bit(PAGE_EXT_IDLE, &page_ext->flags);
  66. }
  67. static inline void set_page_idle(struct page *page)
  68. {
  69. struct page_ext *page_ext = lookup_page_ext(page);
  70. if (unlikely(!page_ext))
  71. return;
  72. set_bit(PAGE_EXT_IDLE, &page_ext->flags);
  73. }
  74. static inline void clear_page_idle(struct page *page)
  75. {
  76. struct page_ext *page_ext = lookup_page_ext(page);
  77. if (unlikely(!page_ext))
  78. return;
  79. clear_bit(PAGE_EXT_IDLE, &page_ext->flags);
  80. }
  81. #endif /* CONFIG_64BIT */
  82. #else /* !CONFIG_PAGE_IDLE_FLAG */
  83. static inline bool page_is_young(struct page *page)
  84. {
  85. return false;
  86. }
  87. static inline void set_page_young(struct page *page)
  88. {
  89. }
  90. static inline bool test_and_clear_page_young(struct page *page)
  91. {
  92. return false;
  93. }
  94. static inline bool page_is_idle(struct page *page)
  95. {
  96. return false;
  97. }
  98. static inline void set_page_idle(struct page *page)
  99. {
  100. }
  101. static inline void clear_page_idle(struct page *page)
  102. {
  103. }
  104. #endif /* CONFIG_PAGE_IDLE_FLAG */
  105. #endif /* _LINUX_MM_PAGE_IDLE_H */