diff options
| author | Thomas Zimmermann <tzimmermann@suse.de> | 2026-04-27 11:26:49 +0300 |
|---|---|---|
| committer | Thomas Zimmermann <tzimmermann@suse.de> | 2026-04-27 11:26:49 +0300 |
| commit | 0fc8f6200d2313278fbf4539bbab74677c685531 (patch) | |
| tree | 35f839d8e2244e0575cbdf60e8505048b5424885 /include/linux/folio_batch.h | |
| parent | d13e855ee923c2ae78307bf6c354305f1406b9e2 (diff) | |
| parent | 254f49634ee16a731174d2ae34bc50bd5f45e731 (diff) | |
| download | linux-0fc8f6200d2313278fbf4539bbab74677c685531.tar.xz | |
Merge drm/drm-fixes into drm-misc-fixes
Getting fixes and updates from v7.1-rc1.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Diffstat (limited to 'include/linux/folio_batch.h')
| -rw-r--r-- | include/linux/folio_batch.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/include/linux/folio_batch.h b/include/linux/folio_batch.h new file mode 100644 index 000000000000..b45946adc50b --- /dev/null +++ b/include/linux/folio_batch.h @@ -0,0 +1,105 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * include/linux/folio_batch.h + * + * In many places it is efficient to batch an operation up against multiple + * folios. A folio_batch is a container which is used for that. + */ + +#ifndef _LINUX_FOLIO_BATCH_H +#define _LINUX_FOLIO_BATCH_H + +#include <linux/types.h> + +/* 31 pointers + header align the folio_batch structure to a power of two */ +#define FOLIO_BATCH_SIZE 31 + +struct folio; + +/** + * 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; + unsigned char i; + bool percpu_pvec_drained; + struct folio *folios[FOLIO_BATCH_SIZE]; +}; + +/** + * 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; + fbatch->i = 0; + fbatch->percpu_pvec_drained = false; +} + +static inline void folio_batch_reinit(struct folio_batch *fbatch) +{ + fbatch->nr = 0; + fbatch->i = 0; +} + +static inline unsigned int folio_batch_count(const struct folio_batch *fbatch) +{ + return fbatch->nr; +} + +static inline unsigned int folio_batch_space(const struct folio_batch *fbatch) +{ + return FOLIO_BATCH_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 folio_batch_space(fbatch); +} + +/** + * folio_batch_next - Return the next folio to process. + * @fbatch: The folio batch being processed. + * + * Use this function to implement a queue of folios. + * + * Return: The next folio in the queue, or NULL if the queue is empty. + */ +static inline struct folio *folio_batch_next(struct folio_batch *fbatch) +{ + if (fbatch->i == fbatch->nr) + return NULL; + return fbatch->folios[fbatch->i++]; +} + +void __folio_batch_release(struct folio_batch *fbatch); + +static inline void folio_batch_release(struct folio_batch *fbatch) +{ + if (folio_batch_count(fbatch)) + __folio_batch_release(fbatch); +} + +void folio_batch_remove_exceptionals(struct folio_batch *fbatch); +#endif /* _LINUX_FOLIO_BATCH_H */ |
