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

source code of linux/include/linux/page_idle.h