1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _LINUX_MM_PAGE_IDLE_H 3*4882a593Smuzhiyun #define _LINUX_MM_PAGE_IDLE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/bitops.h> 6*4882a593Smuzhiyun #include <linux/page-flags.h> 7*4882a593Smuzhiyun #include <linux/page_ext.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifdef CONFIG_PAGE_IDLE_FLAG 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifdef CONFIG_64BIT page_is_young(struct page * page)12*4882a593Smuzhiyunstatic inline bool page_is_young(struct page *page) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun return PageYoung(page); 15*4882a593Smuzhiyun } 16*4882a593Smuzhiyun set_page_young(struct page * page)17*4882a593Smuzhiyunstatic inline void set_page_young(struct page *page) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun SetPageYoung(page); 20*4882a593Smuzhiyun } 21*4882a593Smuzhiyun test_and_clear_page_young(struct page * page)22*4882a593Smuzhiyunstatic inline bool test_and_clear_page_young(struct page *page) 23*4882a593Smuzhiyun { 24*4882a593Smuzhiyun return TestClearPageYoung(page); 25*4882a593Smuzhiyun } 26*4882a593Smuzhiyun page_is_idle(struct page * page)27*4882a593Smuzhiyunstatic inline bool page_is_idle(struct page *page) 28*4882a593Smuzhiyun { 29*4882a593Smuzhiyun return PageIdle(page); 30*4882a593Smuzhiyun } 31*4882a593Smuzhiyun set_page_idle(struct page * page)32*4882a593Smuzhiyunstatic inline void set_page_idle(struct page *page) 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun SetPageIdle(page); 35*4882a593Smuzhiyun } 36*4882a593Smuzhiyun clear_page_idle(struct page * page)37*4882a593Smuzhiyunstatic inline void clear_page_idle(struct page *page) 38*4882a593Smuzhiyun { 39*4882a593Smuzhiyun ClearPageIdle(page); 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun #else /* !CONFIG_64BIT */ 42*4882a593Smuzhiyun /* 43*4882a593Smuzhiyun * If there is not enough space to store Idle and Young bits in page flags, use 44*4882a593Smuzhiyun * page ext flags instead. 45*4882a593Smuzhiyun */ 46*4882a593Smuzhiyun extern struct page_ext_operations page_idle_ops; 47*4882a593Smuzhiyun page_is_young(struct page * page)48*4882a593Smuzhiyunstatic inline bool page_is_young(struct page *page) 49*4882a593Smuzhiyun { 50*4882a593Smuzhiyun struct page_ext *page_ext = page_ext_get(page); 51*4882a593Smuzhiyun bool page_young; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun if (unlikely(!page_ext)) 54*4882a593Smuzhiyun return false; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun page_young = test_bit(PAGE_EXT_YOUNG, &page_ext->flags); 57*4882a593Smuzhiyun page_ext_put(page_ext); 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun return page_young; 60*4882a593Smuzhiyun } 61*4882a593Smuzhiyun set_page_young(struct page * page)62*4882a593Smuzhiyunstatic inline void set_page_young(struct page *page) 63*4882a593Smuzhiyun { 64*4882a593Smuzhiyun struct page_ext *page_ext = page_ext_get(page); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun if (unlikely(!page_ext)) 67*4882a593Smuzhiyun return; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun set_bit(PAGE_EXT_YOUNG, &page_ext->flags); 70*4882a593Smuzhiyun page_ext_put(page_ext); 71*4882a593Smuzhiyun } 72*4882a593Smuzhiyun test_and_clear_page_young(struct page * page)73*4882a593Smuzhiyunstatic inline bool test_and_clear_page_young(struct page *page) 74*4882a593Smuzhiyun { 75*4882a593Smuzhiyun struct page_ext *page_ext = page_ext_get(page); 76*4882a593Smuzhiyun bool page_young; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun if (unlikely(!page_ext)) 79*4882a593Smuzhiyun return false; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun page_young = test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags); 82*4882a593Smuzhiyun page_ext_put(page_ext); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun return page_young; 85*4882a593Smuzhiyun } 86*4882a593Smuzhiyun page_is_idle(struct page * page)87*4882a593Smuzhiyunstatic inline bool page_is_idle(struct page *page) 88*4882a593Smuzhiyun { 89*4882a593Smuzhiyun struct page_ext *page_ext = page_ext_get(page); 90*4882a593Smuzhiyun bool page_idle; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun if (unlikely(!page_ext)) 93*4882a593Smuzhiyun return false; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun page_idle = test_bit(PAGE_EXT_IDLE, &page_ext->flags); 96*4882a593Smuzhiyun page_ext_put(page_ext); 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun return page_idle; 99*4882a593Smuzhiyun } 100*4882a593Smuzhiyun set_page_idle(struct page * page)101*4882a593Smuzhiyunstatic inline void set_page_idle(struct page *page) 102*4882a593Smuzhiyun { 103*4882a593Smuzhiyun struct page_ext *page_ext = page_ext_get(page); 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun if (unlikely(!page_ext)) 106*4882a593Smuzhiyun return; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun set_bit(PAGE_EXT_IDLE, &page_ext->flags); 109*4882a593Smuzhiyun page_ext_put(page_ext); 110*4882a593Smuzhiyun } 111*4882a593Smuzhiyun clear_page_idle(struct page * page)112*4882a593Smuzhiyunstatic inline void clear_page_idle(struct page *page) 113*4882a593Smuzhiyun { 114*4882a593Smuzhiyun struct page_ext *page_ext = page_ext_get(page); 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun if (unlikely(!page_ext)) 117*4882a593Smuzhiyun return; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun clear_bit(PAGE_EXT_IDLE, &page_ext->flags); 120*4882a593Smuzhiyun page_ext_put(page_ext); 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun #endif /* CONFIG_64BIT */ 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #else /* !CONFIG_PAGE_IDLE_FLAG */ 125*4882a593Smuzhiyun page_is_young(struct page * page)126*4882a593Smuzhiyunstatic inline bool page_is_young(struct page *page) 127*4882a593Smuzhiyun { 128*4882a593Smuzhiyun return false; 129*4882a593Smuzhiyun } 130*4882a593Smuzhiyun set_page_young(struct page * page)131*4882a593Smuzhiyunstatic inline void set_page_young(struct page *page) 132*4882a593Smuzhiyun { 133*4882a593Smuzhiyun } 134*4882a593Smuzhiyun test_and_clear_page_young(struct page * page)135*4882a593Smuzhiyunstatic inline bool test_and_clear_page_young(struct page *page) 136*4882a593Smuzhiyun { 137*4882a593Smuzhiyun return false; 138*4882a593Smuzhiyun } 139*4882a593Smuzhiyun page_is_idle(struct page * page)140*4882a593Smuzhiyunstatic inline bool page_is_idle(struct page *page) 141*4882a593Smuzhiyun { 142*4882a593Smuzhiyun return false; 143*4882a593Smuzhiyun } 144*4882a593Smuzhiyun set_page_idle(struct page * page)145*4882a593Smuzhiyunstatic inline void set_page_idle(struct page *page) 146*4882a593Smuzhiyun { 147*4882a593Smuzhiyun } 148*4882a593Smuzhiyun clear_page_idle(struct page * page)149*4882a593Smuzhiyunstatic inline void clear_page_idle(struct page *page) 150*4882a593Smuzhiyun { 151*4882a593Smuzhiyun } 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun #endif /* CONFIG_PAGE_IDLE_FLAG */ 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #endif /* _LINUX_MM_PAGE_IDLE_H */ 156