@@ -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,
@@ -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,
Add pagevec_alloc() and pagevec_free() to allow for pagevecs up to 255 entries in size. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- include/linux/pagevec.h | 7 +++++++ mm/swap.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+)