[PATCH 5.10.y-cip 01/22] mm: slab: provide krealloc_array()
Lad Prabhakar
From: Bartosz Golaszewski <bgolaszewski@...>
commit f0dbd2bd1c22c6670e83ddcd46a9beb8b575e86d upstream. When allocating an array of elements, users should check for multiplication overflow or preferably use one of the provided helpers like: kmalloc_array(). There's no krealloc_array() counterpart but there are many users who use regular krealloc() to reallocate arrays. Let's provide an actual krealloc_array() implementation. While at it: add some documentation regarding krealloc. Link: https://lkml.kernel.org/r/20201109110654.12547-3-brgl@bgdev.pl Signed-off-by: Bartosz Golaszewski <bgolaszewski@...> Acked-by: Vlastimil Babka <vbabka@...> Cc: Alexander Shishkin <alexander.shishkin@...> Cc: Andy Shevchenko <andriy.shevchenko@...> Cc: Borislav Petkov <bp@...> Cc: Borislav Petkov <bp@...> Cc: Christian Knig <christian.koenig@...> Cc: Christoph Lameter <cl@...> Cc: Daniel Vetter <daniel@...> Cc: Daniel Vetter <daniel.vetter@...> Cc: David Airlie <airlied@...> Cc: David Rientjes <rientjes@...> Cc: Gustavo Padovan <gustavo@...> Cc: James Morse <james.morse@...> Cc: Jaroslav Kysela <perex@...> Cc: Jason Wang <jasowang@...> Cc: Joonsoo Kim <iamjoonsoo.kim@...> Cc: Linus Walleij <linus.walleij@...> Cc: Maarten Lankhorst <maarten.lankhorst@...> Cc: Mauro Carvalho Chehab <mchehab@...> Cc: Maxime Ripard <mripard@...> Cc: "Michael S . Tsirkin" <mst@...> Cc: Pekka Enberg <penberg@...> Cc: Robert Richter <rric@...> Cc: Sumit Semwal <sumit.semwal@...> Cc: Takashi Iwai <tiwai@...> Cc: Takashi Iwai <tiwai@...> Cc: Thomas Zimmermann <tzimmermann@...> Cc: Tony Luck <tony.luck@...> Signed-off-by: Andrew Morton <akpm@...> Signed-off-by: Linus Torvalds <torvalds@...> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@...> --- Documentation/core-api/memory-allocation.rst | 4 ++++ include/linux/slab.h | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Documentation/core-api/memory-allocation.rst b/Documentation/core-api/memory-allocation.rst index 4446a1ac36cc..5954ddf6ee13 100644 --- a/Documentation/core-api/memory-allocation.rst +++ b/Documentation/core-api/memory-allocation.rst @@ -147,6 +147,10 @@ The address of a chunk allocated with `kmalloc` is aligned to at least ARCH_KMALLOC_MINALIGN bytes. For sizes which are a power of two, the alignment is also guaranteed to be at least the respective size. +Chunks allocated with kmalloc() can be resized with krealloc(). Similarly +to kmalloc_array(): a helper for resizing arrays is provided in the form of +krealloc_array(). + For large allocations you can use vmalloc() and vzalloc(), or directly request pages from the page allocator. The memory allocated by `vmalloc` and related functions is not physically contiguous. diff --git a/include/linux/slab.h b/include/linux/slab.h index dd6897f62010..be4ba5867ac5 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -592,6 +592,24 @@ static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags) return __kmalloc(bytes, flags); } +/** + * krealloc_array - reallocate memory for an array. + * @p: pointer to the memory chunk to reallocate + * @new_n: new number of elements to alloc + * @new_size: new size of a single member of the array + * @flags: the type of memory to allocate (see kmalloc) + */ +static __must_check inline void * +krealloc_array(void *p, size_t new_n, size_t new_size, gfp_t flags) +{ + size_t bytes; + + if (unlikely(check_mul_overflow(new_n, new_size, &bytes))) + return NULL; + + return krealloc(p, bytes, flags); +} + /** * kcalloc - allocate memory for an array. The memory is set to zero. * @n: number of elements. -- 2.17.1
|
|