• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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);
pagevec_lookup(struct pagevec * pvec,struct address_space * mapping,pgoff_t * start)36  static inline unsigned pagevec_lookup(struct pagevec *pvec,
37  				      struct address_space *mapping,
38  				      pgoff_t *start)
39  {
40  	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);
pagevec_lookup_tag(struct pagevec * pvec,struct address_space * mapping,pgoff_t * index,xa_mark_t tag)49  static inline unsigned pagevec_lookup_tag(struct pagevec *pvec,
50  		struct address_space *mapping, pgoff_t *index, xa_mark_t tag)
51  {
52  	return pagevec_lookup_range_tag(pvec, mapping, index, (pgoff_t)-1, tag);
53  }
54  
pagevec_init(struct pagevec * pvec)55  static inline void pagevec_init(struct pagevec *pvec)
56  {
57  	pvec->nr = 0;
58  	pvec->percpu_pvec_drained = false;
59  }
60  
pagevec_reinit(struct pagevec * pvec)61  static inline void pagevec_reinit(struct pagevec *pvec)
62  {
63  	pvec->nr = 0;
64  }
65  
pagevec_count(struct pagevec * pvec)66  static inline unsigned pagevec_count(struct pagevec *pvec)
67  {
68  	return pvec->nr;
69  }
70  
pagevec_space(struct pagevec * pvec)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   */
pagevec_add(struct pagevec * pvec,struct page * page)79  static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page)
80  {
81  	pvec->pages[pvec->nr++] = page;
82  	return pagevec_space(pvec);
83  }
84  
pagevec_release(struct pagevec * pvec)85  static inline void pagevec_release(struct pagevec *pvec)
86  {
87  	if (pagevec_count(pvec))
88  		__pagevec_release(pvec);
89  }
90  
91  #endif /* _LINUX_PAGEVEC_H */
92