Add pagevec_alloc() and pagevec_free() to allow for pagevecs up to 255 entries in size. Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> --- include/linux/pagevec.h | 7 +++++++ mm/swap.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/linux/pagevec.h b/include/linux/pagevec.h index 4dc45392d776..4d5a48d7a372 100644 --- a/include/linux/pagevec.h +++ b/include/linux/pagevec.h @@ -36,6 +36,13 @@ struct pagevec { void __pagevec_release(struct pagevec *pvec); void __pagevec_lru_add(struct pagevec *pvec); +struct pagevec *pagevec_alloc(unsigned long sz, gfp_t gfp); + +static inline void pagevec_free(struct pagevec *pvec) +{ + kfree(pvec); +} + void pagevec_remove_exceptionals(struct pagevec *pvec); unsigned pagevec_lookup_range_tag(struct pagevec *pvec, diff --git a/mm/swap.c b/mm/swap.c index 1e6f50b312ea..3f856a272cb2 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -988,6 +988,34 @@ void __pagevec_release(struct pagevec *pvec) } EXPORT_SYMBOL(__pagevec_release); +/** + * pagevec_alloc - Allocate a pagevec. + * @sz: Number of pages wanted. + * @gfp: Memory allocation flags. + * + * Allocates a new pagevec. The @sz parameter is advisory; this function + * may allocate a pagevec that can contain fewer pages than requested. If + * the caller cares how many were allocated, it can check pagevec_size(), + * but most callers will simply use as many as were allocated. + * + * Return: A new pagevec, or NULL if memory allocation failed. + */ +struct pagevec *pagevec_alloc(unsigned long sz, gfp_t gfp) +{ + struct pagevec *pvec; + + if (sz > 255) + sz = 255; + pvec = kmalloc_array(sz + 1, sizeof(void *), gfp); + if (!pvec) + return NULL; + pvec->nr = 0; + pvec->sz = sz; + + return pvec; +} +EXPORT_SYMBOL(pagevec_alloc); + #ifdef CONFIG_TRANSPARENT_HUGEPAGE /* used by __split_huge_page_refcount() */ void lru_add_page_tail(struct page *page, struct page *page_tail, -- 2.28.0