Loading include/linux/pagevec.h +69 −0 Original line number Original line Diff line number Diff line Loading @@ -15,8 +15,10 @@ #define PAGEVEC_SIZE 15 #define PAGEVEC_SIZE 15 struct page; struct page; struct folio; struct address_space; struct address_space; /* Layout must match folio_batch */ struct pagevec { struct pagevec { unsigned char nr; unsigned char nr; bool percpu_pvec_drained; bool percpu_pvec_drained; Loading Loading @@ -81,4 +83,71 @@ static inline void pagevec_release(struct pagevec *pvec) __pagevec_release(pvec); __pagevec_release(pvec); } } /** * struct folio_batch - A collection of folios. * * The folio_batch is used to amortise the cost of retrieving and * operating on a set of folios. The order of folios in the batch may be * significant (eg delete_from_page_cache_batch()). Some users of the * folio_batch store "exceptional" entries in it which can be removed * by calling folio_batch_remove_exceptionals(). */ struct folio_batch { unsigned char nr; bool percpu_pvec_drained; struct folio *folios[PAGEVEC_SIZE]; }; /* Layout must match pagevec */ static_assert(sizeof(struct pagevec) == sizeof(struct folio_batch)); static_assert(offsetof(struct pagevec, pages) == offsetof(struct folio_batch, folios)); /** * folio_batch_init() - Initialise a batch of folios * @fbatch: The folio batch. * * A freshly initialised folio_batch contains zero folios. */ static inline void folio_batch_init(struct folio_batch *fbatch) { fbatch->nr = 0; } static inline unsigned int folio_batch_count(struct folio_batch *fbatch) { return fbatch->nr; } static inline unsigned int fbatch_space(struct folio_batch *fbatch) { return PAGEVEC_SIZE - fbatch->nr; } /** * folio_batch_add() - Add a folio to a batch. * @fbatch: The folio batch. * @folio: The folio to add. * * The folio is added to the end of the batch. * The batch must have previously been initialised using folio_batch_init(). * * Return: The number of slots still available. */ static inline unsigned folio_batch_add(struct folio_batch *fbatch, struct folio *folio) { fbatch->folios[fbatch->nr++] = folio; return fbatch_space(fbatch); } static inline void folio_batch_release(struct folio_batch *fbatch) { pagevec_release((struct pagevec *)fbatch); } static inline void folio_batch_remove_exceptionals(struct folio_batch *fbatch) { pagevec_remove_exceptionals((struct pagevec *)fbatch); } #endif /* _LINUX_PAGEVEC_H */ #endif /* _LINUX_PAGEVEC_H */ Loading
include/linux/pagevec.h +69 −0 Original line number Original line Diff line number Diff line Loading @@ -15,8 +15,10 @@ #define PAGEVEC_SIZE 15 #define PAGEVEC_SIZE 15 struct page; struct page; struct folio; struct address_space; struct address_space; /* Layout must match folio_batch */ struct pagevec { struct pagevec { unsigned char nr; unsigned char nr; bool percpu_pvec_drained; bool percpu_pvec_drained; Loading Loading @@ -81,4 +83,71 @@ static inline void pagevec_release(struct pagevec *pvec) __pagevec_release(pvec); __pagevec_release(pvec); } } /** * struct folio_batch - A collection of folios. * * The folio_batch is used to amortise the cost of retrieving and * operating on a set of folios. The order of folios in the batch may be * significant (eg delete_from_page_cache_batch()). Some users of the * folio_batch store "exceptional" entries in it which can be removed * by calling folio_batch_remove_exceptionals(). */ struct folio_batch { unsigned char nr; bool percpu_pvec_drained; struct folio *folios[PAGEVEC_SIZE]; }; /* Layout must match pagevec */ static_assert(sizeof(struct pagevec) == sizeof(struct folio_batch)); static_assert(offsetof(struct pagevec, pages) == offsetof(struct folio_batch, folios)); /** * folio_batch_init() - Initialise a batch of folios * @fbatch: The folio batch. * * A freshly initialised folio_batch contains zero folios. */ static inline void folio_batch_init(struct folio_batch *fbatch) { fbatch->nr = 0; } static inline unsigned int folio_batch_count(struct folio_batch *fbatch) { return fbatch->nr; } static inline unsigned int fbatch_space(struct folio_batch *fbatch) { return PAGEVEC_SIZE - fbatch->nr; } /** * folio_batch_add() - Add a folio to a batch. * @fbatch: The folio batch. * @folio: The folio to add. * * The folio is added to the end of the batch. * The batch must have previously been initialised using folio_batch_init(). * * Return: The number of slots still available. */ static inline unsigned folio_batch_add(struct folio_batch *fbatch, struct folio *folio) { fbatch->folios[fbatch->nr++] = folio; return fbatch_space(fbatch); } static inline void folio_batch_release(struct folio_batch *fbatch) { pagevec_release((struct pagevec *)fbatch); } static inline void folio_batch_remove_exceptionals(struct folio_batch *fbatch) { pagevec_remove_exceptionals((struct pagevec *)fbatch); } #endif /* _LINUX_PAGEVEC_H */ #endif /* _LINUX_PAGEVEC_H */