linux/include/linux/pagevec.h
<<
>>
Prefs
   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
  17struct page;
  18struct address_space;
  19
  20struct pagevec {
  21        unsigned char nr;
  22        bool percpu_pvec_drained;
  23        struct page *pages[PAGEVEC_SIZE];
  24};
  25
  26void __pagevec_release(struct pagevec *pvec);
  27void __pagevec_lru_add(struct pagevec *pvec);
  28unsigned pagevec_lookup_entries(struct pagevec *pvec,
  29                                struct address_space *mapping,
  30                                pgoff_t start, unsigned nr_entries,
  31                                pgoff_t *indices);
  32void pagevec_remove_exceptionals(struct pagevec *pvec);
  33unsigned pagevec_lookup_range(struct pagevec *pvec,
  34                              struct address_space *mapping,
  35                              pgoff_t *start, pgoff_t end);
  36static 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
  43unsigned pagevec_lookup_range_tag(struct pagevec *pvec,
  44                struct address_space *mapping, pgoff_t *index, pgoff_t end,
  45                xa_mark_t tag);
  46unsigned 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);
  49static 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
  55static inline void pagevec_init(struct pagevec *pvec)
  56{
  57        pvec->nr = 0;
  58        pvec->percpu_pvec_drained = false;
  59}
  60
  61static inline void pagevec_reinit(struct pagevec *pvec)
  62{
  63        pvec->nr = 0;
  64}
  65
  66static inline unsigned pagevec_count(struct pagevec *pvec)
  67{
  68        return pvec->nr;
  69}
  70
  71static 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 */
  79static inline unsigned pagevec_add(struct pagevec *pvec, struct page *page)
  80{
  81        pvec->pages[pvec->nr++] = page;
  82        return pagevec_space(pvec);
  83}
  84
  85static 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