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_IDLE_PAGE_TRACKING 10 11#ifdef CONFIG_64BIT 12static inline bool page_is_young(struct page *page) 13{ 14 return PageYoung(page); 15} 16 17static inline void set_page_young(struct page *page) 18{ 19 SetPageYoung(page); 20} 21 22static inline bool test_and_clear_page_young(struct page *page) 23{ 24 return TestClearPageYoung(page); 25} 26 27static inline bool page_is_idle(struct page *page) 28{ 29 return PageIdle(page); 30} 31 32static inline void set_page_idle(struct page *page) 33{ 34 SetPageIdle(page); 35} 36 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 */ 46extern struct page_ext_operations page_idle_ops; 47 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 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 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 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 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 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_IDLE_PAGE_TRACKING */ 110 111static inline bool page_is_young(struct page *page) 112{ 113 return false; 114} 115 116static inline void set_page_young(struct page *page) 117{ 118} 119 120static inline bool test_and_clear_page_young(struct page *page) 121{ 122 return false; 123} 124 125static inline bool page_is_idle(struct page *page) 126{ 127 return false; 128} 129 130static inline void set_page_idle(struct page *page) 131{ 132} 133 134static inline void clear_page_idle(struct page *page) 135{ 136} 137 138#endif /* CONFIG_IDLE_PAGE_TRACKING */ 139 140#endif /* _LINUX_MM_PAGE_IDLE_H */ 141