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 page_is_young(struct page * page)11static inline bool page_is_young(struct page *page) 12 { 13 return PageYoung(page); 14 } 15 set_page_young(struct page * page)16static inline void set_page_young(struct page *page) 17 { 18 SetPageYoung(page); 19 } 20 test_and_clear_page_young(struct page * page)21static inline bool test_and_clear_page_young(struct page *page) 22 { 23 return TestClearPageYoung(page); 24 } 25 page_is_idle(struct page * page)26static inline bool page_is_idle(struct page *page) 27 { 28 return PageIdle(page); 29 } 30 set_page_idle(struct page * page)31static inline void set_page_idle(struct page *page) 32 { 33 SetPageIdle(page); 34 } 35 clear_page_idle(struct page * page)36static 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 page_is_young(struct page * page)47static 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 set_page_young(struct page * page)57static 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 test_and_clear_page_young(struct page * page)67static 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 page_is_idle(struct page * page)77static 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 set_page_idle(struct page * page)87static 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 clear_page_idle(struct page * page)97static 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 page_is_young(struct page * page)110static inline bool page_is_young(struct page *page) 111 { 112 return false; 113 } 114 set_page_young(struct page * page)115static inline void set_page_young(struct page *page) 116 { 117 } 118 test_and_clear_page_young(struct page * page)119static inline bool test_and_clear_page_young(struct page *page) 120 { 121 return false; 122 } 123 page_is_idle(struct page * page)124static inline bool page_is_idle(struct page *page) 125 { 126 return false; 127 } 128 set_page_idle(struct page * page)129static inline void set_page_idle(struct page *page) 130 { 131 } 132 clear_page_idle(struct page * page)133static 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