From: oficerovas@xxxxxxxxxxxx > Sent: 26 January 2024 09:55 > > commit a8749a35c399 ("mm: vmalloc: introduce array allocation functions") > > Linux has dozens of occurrences of vmalloc(array_size()) and > vzalloc(array_size()). Allow to simplify the code by providing > vmalloc_array and vcalloc, as well as the underscored variants that let > the caller specify the GFP flags. > > Acked-by: Michal Hocko <mhocko@xxxxxxxx> > Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Signed-off-by: Alexander Ofitserov <oficerovas@xxxxxxxxxxxx> > --- > include/linux/vmalloc.h | 5 +++++ > mm/util.c | 50 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h > index 76dad53a410ac..0fd47f2f39eb0 100644 > --- a/include/linux/vmalloc.h > +++ b/include/linux/vmalloc.h > @@ -112,6 +112,11 @@ extern void *__vmalloc_node_range(unsigned long size, unsigned long align, > void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask, > int node, const void *caller); > > +extern void *__vmalloc_array(size_t n, size_t size, gfp_t flags); > +extern void *vmalloc_array(size_t n, size_t size); > +extern void *__vcalloc(size_t n, size_t size, gfp_t flags); > +extern void *vcalloc(size_t n, size_t size); Symbols starting __ should really be ones that are part of the implementation and not publicly visible. ... > +/** > + * __vmalloc_array - allocate memory for a virtually contiguous array. > + * @n: number of elements. > + * @size: element size. > + * @flags: the type of memory to allocate (see kmalloc). > + */ > +void *__vmalloc_array(size_t n, size_t size, gfp_t flags) > +{ > + size_t bytes; > + > + if (unlikely(check_mul_overflow(n, size, &bytes))) > + return NULL; > + return __vmalloc(bytes, flags); > +} > +EXPORT_SYMBOL(__vmalloc_array); > + > +/** > + * vmalloc_array - allocate memory for a virtually contiguous array. > + * @n: number of elements. > + * @size: element size. > + */ > +void *vmalloc_array(size_t n, size_t size) > +{ > + return __vmalloc_array(n, size, GFP_KERNEL); > +} > +EXPORT_SYMBOL(vmalloc_array); and that should just be an inline wrapper on the function above. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)