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 /* 14 pointers + two long's align the pagevec structure to a power of two */ 9 #define PAGEVEC_SIZE 14 10 11 struct page; 12 struct address_space; 13 14 struct pagevec { 15 unsigned long nr; 16 unsigned long cold; 17 struct page *pages[PAGEVEC_SIZE]; 18 }; 19 20 void __pagevec_release(struct pagevec *pvec); 21 void __pagevec_release_nonlru(struct pagevec *pvec); 22 void __pagevec_free(struct pagevec *pvec); 23 void __pagevec_lru_add(struct pagevec *pvec); 24 void __pagevec_lru_add_active(struct pagevec *pvec); 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_release_nonlru(struct pagevec *pvec) 70 { 71 if (pagevec_count(pvec)) 72 __pagevec_release_nonlru(pvec); 73 } 74 75 static inline void pagevec_free(struct pagevec *pvec) 76 { 77 if (pagevec_count(pvec)) 78 __pagevec_free(pvec); 79 } 80 81 static inline void pagevec_lru_add(struct pagevec *pvec) 82 { 83 if (pagevec_count(pvec)) 84 __pagevec_lru_add(pvec); 85 } 86