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