Messages in this thread | | | Date | Tue, 14 Feb 2012 12:46:47 -0800 | From | Andrew Morton <> | Subject | Re: Uninline kcalloc |
| |
On Tue, 14 Feb 2012 13:37:44 -0600 (CST) Christoph Lameter <cl@linux.com> wrote:
> This patch still preserves kcalloc. But note that if kcalloc returns NULL > then multiple conditions may have caused it. One is that the array is > simply too large. The other may be that such an allocation is not possible > due to fragmentation. > > > Subject: Introduce calculate_array_size > > calculate_array_size calculates the size of an array while > checking for errors. Returns 0 if the size is too large. > > Signed-off-by: Christoph Lameter <cl@linux.com> > > > --- > include/linux/slab.h | 15 +++++++++++++++ > mm/util.c | 9 ++++++--- > 2 files changed, 21 insertions(+), 3 deletions(-) > > Index: linux-2.6/include/linux/slab.h > =================================================================== > --- linux-2.6.orig/include/linux/slab.h 2012-02-14 13:32:43.000000000 -0600 > +++ linux-2.6/include/linux/slab.h 2012-02-14 13:34:41.000000000 -0600 > @@ -242,6 +242,21 @@ size_t ksize(const void *); > */ > void *kcalloc(size_t n, size_t size, gfp_t flags); > > +/* > + * calculate_array_size - Calculate an array size given the size of a > + * particular element with checking for overflow. > + * > + * Return 0 if there is an overflow. > + */ > +static inline long calculate_array_size(size_t n, size_t size) > +{ > + if (size != 0 && n > ULONG_MAX / size) > + > + return 0; > + > + return n * size; > +} > + > #if !defined(CONFIG_NUMA) && !defined(CONFIG_SLOB) > /** > * kmalloc_node - allocate memory from a specific node > Index: linux-2.6/mm/util.c > =================================================================== > --- linux-2.6.orig/mm/util.c 2012-02-14 13:32:54.000000000 -0600 > +++ linux-2.6/mm/util.c 2012-02-14 13:34:10.000000000 -0600 > @@ -83,9 +83,12 @@ EXPORT_SYMBOL(kmemdup); > */ > void *kcalloc(size_t n, size_t size, gfp_t flags) > { > - if (size != 0 && n > ULONG_MAX / size) > - return NULL; > - return __kmalloc(n * size, flags | __GFP_ZERO); > + size_t s = calculate_array_size(n, size); > + > + if (s) > + return kzalloc(s, flags); > + > + return NULL; > } > EXPORT_SYMBOL(kcalloc);
The patch appears to be a no-op. Confused.
| |