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