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