[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
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.

Join cip-dev@lists.cip-project.org to automatically receive all group messages.