1 /* 2 * include/linux/pagevec.h 3 * 4 * In many places it is efficient to batch an operation up against multiple 5 * pages. A pagevec is a multipage container which is used for that. 6 */ 7 8 #ifndef _LINUX_PAGEVEC_H 9 #define _LINUX_PAGEVEC_H 10 11 /* 14 pointers + two long's align the pagevec structure to a power of two */ 12 #define PAGEVEC_SIZE 14 13 14 struct page; 15 struct address_space; 16 17 struct pagevec { 18 unsigned long nr; 19 unsigned long cold; 20 struct page *pages[PAGEVEC_SIZE]; 21 }; 22 23 void __pagevec_release(struct pagevec *pvec); 24 void ____pagevec_lru_add(struct pagevec *pvec, enum lru_list lru); 25 void pagevec_strip(struct pagevec *pvec); 26 unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping, 27 pgoff_t start, unsigned nr_pages); 28 unsigned pagevec_lookup_tag(struct pagevec *pvec, 29 struct address_space *mapping, pgoff_t *index, int tag, 30 unsigned nr_pages); 31 32 static inline void pagevec_init(struct pagevec *pvec, int cold) 33 { 34 pvec->nr = 0; 35 pvec->cold = cold; 36 } 37 38 static inline void pagevec_reinit(struct pagevec *pvec) 39 { 40 pvec->nr = 0; 41 } 42 43 static inline unsigned pagevec_count(struct pagevec *pvec) 44 { 45 return pvec->nr; 46 } 47 48 static inline unsigned pagevec_space(struct pagevec *pvec) 49 { 50 return PAGEVEC_SIZE - pvec->nr; 51 } 52 53 /* 54 * Add a page to a pagevec. Returns the number of slots still available. 55 */ 56 static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page) 57 { 58 pvec->pages[pvec->nr++] = page; 59 return pagevec_space(pvec); 60 } 61 62 63 static inline void pagevec_release(struct pagevec *pvec) 64 { 65 if (pagevec_count(pvec)) 66 __pagevec_release(pvec); 67 } 68 69 static inline void __pagevec_lru_add_anon(struct pagevec *pvec) 70 { 71 ____pagevec_lru_add(pvec, LRU_INACTIVE_ANON); 72 } 73 74 static inline void __pagevec_lru_add_active_anon(struct pagevec *pvec) 75 { 76 ____pagevec_lru_add(pvec, LRU_ACTIVE_ANON); 77 } 78 79 static inline void __pagevec_lru_add_file(struct pagevec *pvec) 80 { 81 ____pagevec_lru_add(pvec, LRU_INACTIVE_FILE); 82 } 83 84 static inline void __pagevec_lru_add_active_file(struct pagevec *pvec) 85 { 86 ____pagevec_lru_add(pvec, LRU_ACTIVE_FILE); 87 } 88 89 static inline void pagevec_lru_add_file(struct pagevec *pvec) 90 { 91 if (pagevec_count(pvec)) 92 __pagevec_lru_add_file(pvec); 93 } 94 95 static inline void pagevec_lru_add_anon(struct pagevec *pvec) 96 { 97 if (pagevec_count(pvec)) 98 __pagevec_lru_add_anon(pvec); 99 } 100 101 #endif /* _LINUX_PAGEVEC_H */ 102