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