xref: /openbmc/linux/include/linux/page_idle.h (revision 73e791d7)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
233c3fc71SVladimir Davydov #ifndef _LINUX_MM_PAGE_IDLE_H
333c3fc71SVladimir Davydov #define _LINUX_MM_PAGE_IDLE_H
433c3fc71SVladimir Davydov 
533c3fc71SVladimir Davydov #include <linux/bitops.h>
633c3fc71SVladimir Davydov #include <linux/page-flags.h>
733c3fc71SVladimir Davydov #include <linux/page_ext.h>
833c3fc71SVladimir Davydov 
91c676e0dSSeongJae Park #ifdef CONFIG_PAGE_IDLE_FLAG
1033c3fc71SVladimir Davydov 
1135a020baSMatthew Wilcox (Oracle) #ifndef CONFIG_64BIT
1233c3fc71SVladimir Davydov /*
1333c3fc71SVladimir Davydov  * If there is not enough space to store Idle and Young bits in page flags, use
1433c3fc71SVladimir Davydov  * page ext flags instead.
1533c3fc71SVladimir Davydov  */
folio_test_young(struct folio * folio)1635a020baSMatthew Wilcox (Oracle) static inline bool folio_test_young(struct folio *folio)
1733c3fc71SVladimir Davydov {
18*b1d5488aSCharan Teja Kalla 	struct page_ext *page_ext = page_ext_get(&folio->page);
19*b1d5488aSCharan Teja Kalla 	bool page_young;
20f86e4271SYang Shi 
21f86e4271SYang Shi 	if (unlikely(!page_ext))
22f86e4271SYang Shi 		return false;
23f86e4271SYang Shi 
24*b1d5488aSCharan Teja Kalla 	page_young = test_bit(PAGE_EXT_YOUNG, &page_ext->flags);
25*b1d5488aSCharan Teja Kalla 	page_ext_put(page_ext);
26*b1d5488aSCharan Teja Kalla 
27*b1d5488aSCharan Teja Kalla 	return page_young;
2833c3fc71SVladimir Davydov }
2933c3fc71SVladimir Davydov 
folio_set_young(struct folio * folio)3035a020baSMatthew Wilcox (Oracle) static inline void folio_set_young(struct folio *folio)
3133c3fc71SVladimir Davydov {
32*b1d5488aSCharan Teja Kalla 	struct page_ext *page_ext = page_ext_get(&folio->page);
33f86e4271SYang Shi 
34f86e4271SYang Shi 	if (unlikely(!page_ext))
35f86e4271SYang Shi 		return;
36f86e4271SYang Shi 
37f86e4271SYang Shi 	set_bit(PAGE_EXT_YOUNG, &page_ext->flags);
38*b1d5488aSCharan Teja Kalla 	page_ext_put(page_ext);
3933c3fc71SVladimir Davydov }
4033c3fc71SVladimir Davydov 
folio_test_clear_young(struct folio * folio)4135a020baSMatthew Wilcox (Oracle) static inline bool folio_test_clear_young(struct folio *folio)
4233c3fc71SVladimir Davydov {
43*b1d5488aSCharan Teja Kalla 	struct page_ext *page_ext = page_ext_get(&folio->page);
44*b1d5488aSCharan Teja Kalla 	bool page_young;
45f86e4271SYang Shi 
46f86e4271SYang Shi 	if (unlikely(!page_ext))
47f86e4271SYang Shi 		return false;
48f86e4271SYang Shi 
49*b1d5488aSCharan Teja Kalla 	page_young = test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags);
50*b1d5488aSCharan Teja Kalla 	page_ext_put(page_ext);
51*b1d5488aSCharan Teja Kalla 
52*b1d5488aSCharan Teja Kalla 	return page_young;
5333c3fc71SVladimir Davydov }
5433c3fc71SVladimir Davydov 
folio_test_idle(struct folio * folio)5535a020baSMatthew Wilcox (Oracle) static inline bool folio_test_idle(struct folio *folio)
5633c3fc71SVladimir Davydov {
57*b1d5488aSCharan Teja Kalla 	struct page_ext *page_ext = page_ext_get(&folio->page);
58*b1d5488aSCharan Teja Kalla 	bool page_idle;
59f86e4271SYang Shi 
60f86e4271SYang Shi 	if (unlikely(!page_ext))
61f86e4271SYang Shi 		return false;
62f86e4271SYang Shi 
63*b1d5488aSCharan Teja Kalla 	page_idle =  test_bit(PAGE_EXT_IDLE, &page_ext->flags);
64*b1d5488aSCharan Teja Kalla 	page_ext_put(page_ext);
65*b1d5488aSCharan Teja Kalla 
66*b1d5488aSCharan Teja Kalla 	return page_idle;
6733c3fc71SVladimir Davydov }
6833c3fc71SVladimir Davydov 
folio_set_idle(struct folio * folio)6935a020baSMatthew Wilcox (Oracle) static inline void folio_set_idle(struct folio *folio)
7033c3fc71SVladimir Davydov {
71*b1d5488aSCharan Teja Kalla 	struct page_ext *page_ext = page_ext_get(&folio->page);
72f86e4271SYang Shi 
73f86e4271SYang Shi 	if (unlikely(!page_ext))
74f86e4271SYang Shi 		return;
75f86e4271SYang Shi 
76f86e4271SYang Shi 	set_bit(PAGE_EXT_IDLE, &page_ext->flags);
77*b1d5488aSCharan Teja Kalla 	page_ext_put(page_ext);
7833c3fc71SVladimir Davydov }
7933c3fc71SVladimir Davydov 
folio_clear_idle(struct folio * folio)8035a020baSMatthew Wilcox (Oracle) static inline void folio_clear_idle(struct folio *folio)
8133c3fc71SVladimir Davydov {
82*b1d5488aSCharan Teja Kalla 	struct page_ext *page_ext = page_ext_get(&folio->page);
83f86e4271SYang Shi 
84f86e4271SYang Shi 	if (unlikely(!page_ext))
85f86e4271SYang Shi 		return;
86f86e4271SYang Shi 
87f86e4271SYang Shi 	clear_bit(PAGE_EXT_IDLE, &page_ext->flags);
88*b1d5488aSCharan Teja Kalla 	page_ext_put(page_ext);
8933c3fc71SVladimir Davydov }
9035a020baSMatthew Wilcox (Oracle) #endif /* !CONFIG_64BIT */
9133c3fc71SVladimir Davydov 
921c676e0dSSeongJae Park #else /* !CONFIG_PAGE_IDLE_FLAG */
9333c3fc71SVladimir Davydov 
folio_test_young(struct folio * folio)9435a020baSMatthew Wilcox (Oracle) static inline bool folio_test_young(struct folio *folio)
9533c3fc71SVladimir Davydov {
9633c3fc71SVladimir Davydov 	return false;
9733c3fc71SVladimir Davydov }
9833c3fc71SVladimir Davydov 
folio_set_young(struct folio * folio)9935a020baSMatthew Wilcox (Oracle) static inline void folio_set_young(struct folio *folio)
10033c3fc71SVladimir Davydov {
10133c3fc71SVladimir Davydov }
10233c3fc71SVladimir Davydov 
folio_test_clear_young(struct folio * folio)10335a020baSMatthew Wilcox (Oracle) static inline bool folio_test_clear_young(struct folio *folio)
10433c3fc71SVladimir Davydov {
10533c3fc71SVladimir Davydov 	return false;
10633c3fc71SVladimir Davydov }
10733c3fc71SVladimir Davydov 
folio_test_idle(struct folio * folio)10835a020baSMatthew Wilcox (Oracle) static inline bool folio_test_idle(struct folio *folio)
10933c3fc71SVladimir Davydov {
11033c3fc71SVladimir Davydov 	return false;
11133c3fc71SVladimir Davydov }
11233c3fc71SVladimir Davydov 
folio_set_idle(struct folio * folio)11335a020baSMatthew Wilcox (Oracle) static inline void folio_set_idle(struct folio *folio)
11433c3fc71SVladimir Davydov {
11533c3fc71SVladimir Davydov }
11633c3fc71SVladimir Davydov 
folio_clear_idle(struct folio * folio)11735a020baSMatthew Wilcox (Oracle) static inline void folio_clear_idle(struct folio *folio)
11833c3fc71SVladimir Davydov {
11933c3fc71SVladimir Davydov }
12033c3fc71SVladimir Davydov 
1211c676e0dSSeongJae Park #endif /* CONFIG_PAGE_IDLE_FLAG */
12233c3fc71SVladimir Davydov 
page_is_young(struct page * page)12335a020baSMatthew Wilcox (Oracle) static inline bool page_is_young(struct page *page)
12435a020baSMatthew Wilcox (Oracle) {
12535a020baSMatthew Wilcox (Oracle) 	return folio_test_young(page_folio(page));
12635a020baSMatthew Wilcox (Oracle) }
12735a020baSMatthew Wilcox (Oracle) 
set_page_young(struct page * page)12835a020baSMatthew Wilcox (Oracle) static inline void set_page_young(struct page *page)
12935a020baSMatthew Wilcox (Oracle) {
13035a020baSMatthew Wilcox (Oracle) 	folio_set_young(page_folio(page));
13135a020baSMatthew Wilcox (Oracle) }
13235a020baSMatthew Wilcox (Oracle) 
test_and_clear_page_young(struct page * page)13335a020baSMatthew Wilcox (Oracle) static inline bool test_and_clear_page_young(struct page *page)
13435a020baSMatthew Wilcox (Oracle) {
13535a020baSMatthew Wilcox (Oracle) 	return folio_test_clear_young(page_folio(page));
13635a020baSMatthew Wilcox (Oracle) }
13735a020baSMatthew Wilcox (Oracle) 
page_is_idle(struct page * page)13835a020baSMatthew Wilcox (Oracle) static inline bool page_is_idle(struct page *page)
13935a020baSMatthew Wilcox (Oracle) {
14035a020baSMatthew Wilcox (Oracle) 	return folio_test_idle(page_folio(page));
14135a020baSMatthew Wilcox (Oracle) }
14235a020baSMatthew Wilcox (Oracle) 
set_page_idle(struct page * page)14335a020baSMatthew Wilcox (Oracle) static inline void set_page_idle(struct page *page)
14435a020baSMatthew Wilcox (Oracle) {
14535a020baSMatthew Wilcox (Oracle) 	folio_set_idle(page_folio(page));
14635a020baSMatthew Wilcox (Oracle) }
14733c3fc71SVladimir Davydov #endif /* _LINUX_MM_PAGE_IDLE_H */
148