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