Provide vfree_bulk() function and make it public. Some users need to vfree vmalloc ptrs. as one set of batch. For example there is a kvfree_rcu() API that keeps pointers in array. As of now start with a simple implementation of vmalloc-bulk interface that can be improved step by step in the future. To: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Suggested-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Signed-off-by: Uladzislau Rezki (Sony) <urezki@xxxxxxxxx> --- include/linux/vmalloc.h | 1 + mm/vmalloc.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 3de7be6dd17c..bef1588c165b 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -112,6 +112,7 @@ void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask, extern void vfree(const void *addr); extern void vfree_atomic(const void *addr); +extern void vfree_bulk(size_t count, void **addrs); extern void *vmap(struct page **pages, unsigned int count, unsigned long flags, pgprot_t prot); diff --git a/mm/vmalloc.c b/mm/vmalloc.c index d5f2a84e488a..a07aa336b05d 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -2365,6 +2365,37 @@ void vfree(const void *addr) } EXPORT_SYMBOL(vfree); +/** + * vfree_bulk - Release memory allocated by vmalloc() + * @count: Number of elements in array + * @addrs: Array of elements to be freed + * + * Free the virtually continuous memory area starting at @addrs[i], as obtained + * from one of the vmalloc() family of APIs. This will usually also free the + * physical memory underlying the virtual allocation, but that memory is + * reference counted, so it will not be freed until the last user goes away. + * + * If @addrs[i] is NULL, no operation is performed. + * + * Context: + * Same as for vfree() + */ +void vfree_bulk(size_t count, void **addrs) +{ + unsigned int i; + + BUG_ON(in_nmi()); + might_sleep_if(!in_interrupt()); + + for (i = 0; i < count; i++) { + kmemleak_free(addrs[i]); + + if (addrs[i]) + __vfree(addrs[i]); + } +} +EXPORT_SYMBOL(vfree_bulk); + /** * vunmap - release virtual mapping obtained by vmap() * @addr: memory base address -- 2.20.1