1 #ifndef _LINUX_MM_PAGE_IDLE_H 2 #define _LINUX_MM_PAGE_IDLE_H 3 4 #include <linux/bitops.h> 5 #include <linux/page-flags.h> 6 #include <linux/page_ext.h> 7 8 #ifdef CONFIG_IDLE_PAGE_TRACKING 9 10 #ifdef CONFIG_64BIT 11 static inline bool page_is_young(struct page *page) 12 { 13 return PageYoung(page); 14 } 15 16 static inline void set_page_young(struct page *page) 17 { 18 SetPageYoung(page); 19 } 20 21 static inline bool test_and_clear_page_young(struct page *page) 22 { 23 return TestClearPageYoung(page); 24 } 25 26 static inline bool page_is_idle(struct page *page) 27 { 28 return PageIdle(page); 29 } 30 31 static inline void set_page_idle(struct page *page) 32 { 33 SetPageIdle(page); 34 } 35 36 static inline void clear_page_idle(struct page *page) 37 { 38 ClearPageIdle(page); 39 } 40 #else /* !CONFIG_64BIT */ 41 /* 42 * If there is not enough space to store Idle and Young bits in page flags, use 43 * page ext flags instead. 44 */ 45 extern struct page_ext_operations page_idle_ops; 46 47 static inline bool page_is_young(struct page *page) 48 { 49 struct page_ext *page_ext = lookup_page_ext(page); 50 51 if (unlikely(!page_ext)) 52 return false; 53 54 return test_bit(PAGE_EXT_YOUNG, &page_ext->flags); 55 } 56 57 static inline void set_page_young(struct page *page) 58 { 59 struct page_ext *page_ext = lookup_page_ext(page); 60 61 if (unlikely(!page_ext)) 62 return; 63 64 set_bit(PAGE_EXT_YOUNG, &page_ext->flags); 65 } 66 67 static inline bool test_and_clear_page_young(struct page *page) 68 { 69 struct page_ext *page_ext = lookup_page_ext(page); 70 71 if (unlikely(!page_ext)) 72 return false; 73 74 return test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags); 75 } 76 77 static inline bool page_is_idle(struct page *page) 78 { 79 struct page_ext *page_ext = lookup_page_ext(page); 80 81 if (unlikely(!page_ext)) 82 return false; 83 84 return test_bit(PAGE_EXT_IDLE, &page_ext->flags); 85 } 86 87 static inline void set_page_idle(struct page *page) 88 { 89 struct page_ext *page_ext = lookup_page_ext(page); 90 91 if (unlikely(!page_ext)) 92 return; 93 94 set_bit(PAGE_EXT_IDLE, &page_ext->flags); 95 } 96 97 static inline void clear_page_idle(struct page *page) 98 { 99 struct page_ext *page_ext = lookup_page_ext(page); 100 101 if (unlikely(!page_ext)) 102 return; 103 104 clear_bit(PAGE_EXT_IDLE, &page_ext->flags); 105 } 106 #endif /* CONFIG_64BIT */ 107 108 #else /* !CONFIG_IDLE_PAGE_TRACKING */ 109 110 static inline bool page_is_young(struct page *page) 111 { 112 return false; 113 } 114 115 static inline void set_page_young(struct page *page) 116 { 117 } 118 119 static inline bool test_and_clear_page_young(struct page *page) 120 { 121 return false; 122 } 123 124 static inline bool page_is_idle(struct page *page) 125 { 126 return false; 127 } 128 129 static inline void set_page_idle(struct page *page) 130 { 131 } 132 133 static inline void clear_page_idle(struct page *page) 134 { 135 } 136 137 #endif /* CONFIG_IDLE_PAGE_TRACKING */ 138 139 #endif /* _LINUX_MM_PAGE_IDLE_H */ 140