Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : /* 3 : * include/linux/pagevec.h 4 : * 5 : * In many places it is efficient to batch an operation up against multiple 6 : * pages. A pagevec is a multipage container which is used for that. 7 : */ 8 : 9 : #ifndef _LINUX_PAGEVEC_H 10 : #define _LINUX_PAGEVEC_H 11 : 12 : #include <linux/xarray.h> 13 : 14 : /* 15 pointers + header align the pagevec structure to a power of two */ 15 : #define PAGEVEC_SIZE 15 16 : 17 : struct page; 18 : struct address_space; 19 : 20 : struct pagevec { 21 : unsigned char nr; 22 : bool percpu_pvec_drained; 23 : struct page *pages[PAGEVEC_SIZE]; 24 : }; 25 : 26 : void __pagevec_release(struct pagevec *pvec); 27 : void __pagevec_lru_add(struct pagevec *pvec); 28 : void pagevec_remove_exceptionals(struct pagevec *pvec); 29 : unsigned pagevec_lookup_range(struct pagevec *pvec, 30 : struct address_space *mapping, 31 : pgoff_t *start, pgoff_t end); 32 0 : static inline unsigned pagevec_lookup(struct pagevec *pvec, 33 : struct address_space *mapping, 34 : pgoff_t *start) 35 : { 36 0 : return pagevec_lookup_range(pvec, mapping, start, (pgoff_t)-1); 37 : } 38 : 39 : unsigned pagevec_lookup_range_tag(struct pagevec *pvec, 40 : struct address_space *mapping, pgoff_t *index, pgoff_t end, 41 : xa_mark_t tag); 42 : static inline unsigned pagevec_lookup_tag(struct pagevec *pvec, 43 : struct address_space *mapping, pgoff_t *index, xa_mark_t tag) 44 : { 45 : return pagevec_lookup_range_tag(pvec, mapping, index, (pgoff_t)-1, tag); 46 : } 47 : 48 2626 : static inline void pagevec_init(struct pagevec *pvec) 49 : { 50 2626 : pvec->nr = 0; 51 2486 : pvec->percpu_pvec_drained = false; 52 1747 : } 53 : 54 17635 : static inline void pagevec_reinit(struct pagevec *pvec) 55 : { 56 17635 : pvec->nr = 0; 57 : } 58 : 59 275643 : static inline unsigned pagevec_count(struct pagevec *pvec) 60 : { 61 198885 : return pvec->nr; 62 : } 63 : 64 113714 : static inline unsigned pagevec_space(struct pagevec *pvec) 65 : { 66 113714 : return PAGEVEC_SIZE - pvec->nr; 67 : } 68 : 69 : /* 70 : * Add a page to a pagevec. Returns the number of slots still available. 71 : */ 72 113714 : static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page) 73 : { 74 113714 : pvec->pages[pvec->nr++] = page; 75 113714 : return pagevec_space(pvec); 76 : } 77 : 78 722 : static inline void pagevec_release(struct pagevec *pvec) 79 : { 80 722 : if (pagevec_count(pvec)) 81 720 : __pagevec_release(pvec); 82 : } 83 : 84 : #endif /* _LINUX_PAGEVEC_H */