Branch data 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 : : unsigned pagevec_lookup_entries(struct pagevec *pvec, 29 : : struct address_space *mapping, 30 : : pgoff_t start, unsigned nr_entries, 31 : : pgoff_t *indices); 32 : : void pagevec_remove_exceptionals(struct pagevec *pvec); 33 : : unsigned pagevec_lookup_range(struct pagevec *pvec, 34 : : struct address_space *mapping, 35 : : pgoff_t *start, pgoff_t end); 36 : : static inline unsigned pagevec_lookup(struct pagevec *pvec, 37 : : struct address_space *mapping, 38 : : pgoff_t *start) 39 : : { 40 : 0 : return pagevec_lookup_range(pvec, mapping, start, (pgoff_t)-1); 41 : : } 42 : : 43 : : unsigned pagevec_lookup_range_tag(struct pagevec *pvec, 44 : : struct address_space *mapping, pgoff_t *index, pgoff_t end, 45 : : xa_mark_t tag); 46 : : unsigned pagevec_lookup_range_nr_tag(struct pagevec *pvec, 47 : : struct address_space *mapping, pgoff_t *index, pgoff_t end, 48 : : xa_mark_t tag, unsigned max_pages); 49 : : static inline unsigned pagevec_lookup_tag(struct pagevec *pvec, 50 : : struct address_space *mapping, pgoff_t *index, xa_mark_t tag) 51 : : { 52 : 0 : return pagevec_lookup_range_tag(pvec, mapping, index, (pgoff_t)-1, tag); 53 : : } 54 : : 55 : : static inline void pagevec_init(struct pagevec *pvec) 56 : : { 57 : 3 : pvec->nr = 0; 58 : 3 : pvec->percpu_pvec_drained = false; 59 : : } 60 : : 61 : : static inline void pagevec_reinit(struct pagevec *pvec) 62 : : { 63 : 3 : pvec->nr = 0; 64 : : } 65 : : 66 : : static inline unsigned pagevec_count(struct pagevec *pvec) 67 : : { 68 : 3 : return pvec->nr; 69 : : } 70 : : 71 : : static inline unsigned pagevec_space(struct pagevec *pvec) 72 : : { 73 : : return PAGEVEC_SIZE - pvec->nr; 74 : : } 75 : : 76 : : /* 77 : : * Add a page to a pagevec. Returns the number of slots still available. 78 : : */ 79 : : static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page) 80 : : { 81 : 3 : pvec->pages[pvec->nr++] = page; 82 : : return pagevec_space(pvec); 83 : : } 84 : : 85 : : static inline void pagevec_release(struct pagevec *pvec) 86 : : { 87 : 3 : if (pagevec_count(pvec)) 88 : 3 : __pagevec_release(pvec); 89 : : } 90 : : 91 : : #endif /* _LINUX_PAGEVEC_H */