Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _LINUX_MM_PAGE_IDLE_H
0003 #define _LINUX_MM_PAGE_IDLE_H
0004 
0005 #include <linux/bitops.h>
0006 #include <linux/page-flags.h>
0007 #include <linux/page_ext.h>
0008 
0009 #ifdef CONFIG_PAGE_IDLE_FLAG
0010 
0011 #ifndef CONFIG_64BIT
0012 /*
0013  * If there is not enough space to store Idle and Young bits in page flags, use
0014  * page ext flags instead.
0015  */
0016 
0017 static inline bool folio_test_young(struct folio *folio)
0018 {
0019     struct page_ext *page_ext = lookup_page_ext(&folio->page);
0020 
0021     if (unlikely(!page_ext))
0022         return false;
0023 
0024     return test_bit(PAGE_EXT_YOUNG, &page_ext->flags);
0025 }
0026 
0027 static inline void folio_set_young(struct folio *folio)
0028 {
0029     struct page_ext *page_ext = lookup_page_ext(&folio->page);
0030 
0031     if (unlikely(!page_ext))
0032         return;
0033 
0034     set_bit(PAGE_EXT_YOUNG, &page_ext->flags);
0035 }
0036 
0037 static inline bool folio_test_clear_young(struct folio *folio)
0038 {
0039     struct page_ext *page_ext = lookup_page_ext(&folio->page);
0040 
0041     if (unlikely(!page_ext))
0042         return false;
0043 
0044     return test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags);
0045 }
0046 
0047 static inline bool folio_test_idle(struct folio *folio)
0048 {
0049     struct page_ext *page_ext = lookup_page_ext(&folio->page);
0050 
0051     if (unlikely(!page_ext))
0052         return false;
0053 
0054     return test_bit(PAGE_EXT_IDLE, &page_ext->flags);
0055 }
0056 
0057 static inline void folio_set_idle(struct folio *folio)
0058 {
0059     struct page_ext *page_ext = lookup_page_ext(&folio->page);
0060 
0061     if (unlikely(!page_ext))
0062         return;
0063 
0064     set_bit(PAGE_EXT_IDLE, &page_ext->flags);
0065 }
0066 
0067 static inline void folio_clear_idle(struct folio *folio)
0068 {
0069     struct page_ext *page_ext = lookup_page_ext(&folio->page);
0070 
0071     if (unlikely(!page_ext))
0072         return;
0073 
0074     clear_bit(PAGE_EXT_IDLE, &page_ext->flags);
0075 }
0076 #endif /* !CONFIG_64BIT */
0077 
0078 #else /* !CONFIG_PAGE_IDLE_FLAG */
0079 
0080 static inline bool folio_test_young(struct folio *folio)
0081 {
0082     return false;
0083 }
0084 
0085 static inline void folio_set_young(struct folio *folio)
0086 {
0087 }
0088 
0089 static inline bool folio_test_clear_young(struct folio *folio)
0090 {
0091     return false;
0092 }
0093 
0094 static inline bool folio_test_idle(struct folio *folio)
0095 {
0096     return false;
0097 }
0098 
0099 static inline void folio_set_idle(struct folio *folio)
0100 {
0101 }
0102 
0103 static inline void folio_clear_idle(struct folio *folio)
0104 {
0105 }
0106 
0107 #endif /* CONFIG_PAGE_IDLE_FLAG */
0108 
0109 static inline bool page_is_young(struct page *page)
0110 {
0111     return folio_test_young(page_folio(page));
0112 }
0113 
0114 static inline void set_page_young(struct page *page)
0115 {
0116     folio_set_young(page_folio(page));
0117 }
0118 
0119 static inline bool test_and_clear_page_young(struct page *page)
0120 {
0121     return folio_test_clear_young(page_folio(page));
0122 }
0123 
0124 static inline bool page_is_idle(struct page *page)
0125 {
0126     return folio_test_idle(page_folio(page));
0127 }
0128 
0129 static inline void set_page_idle(struct page *page)
0130 {
0131     folio_set_idle(page_folio(page));
0132 }
0133 
0134 static inline void clear_page_idle(struct page *page)
0135 {
0136     folio_clear_idle(page_folio(page));
0137 }
0138 #endif /* _LINUX_MM_PAGE_IDLE_H */