Skip to content

Commit

Permalink
slab: Return NULL for oversized allocations
Browse files Browse the repository at this point in the history
The inline path seems to have changed the SLAB behavior for very large
kmalloc allocations with  commit e336601 ("slab: Use common
kmalloc_index/kmalloc_size functions"). This patch restores the old
behavior but also adds diagnostics so that we can figure where in the
code these large allocations occur.

Reported-and-tested-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: Christoph Lameter <cl@linux.com>
Link: http://lkml.kernel.org/r/201305040348.CIF81716.OStQOHFJMFLOVF@I-love.SAKURA.ne.jp
[ penberg@kernel.org: use WARN_ON_ONCE ]
Signed-off-by: Pekka Enberg <penberg@kernel.org>
  • Loading branch information
Christoph Lameter authored and Pekka Enberg committed May 6, 2013
1 parent 14e50c6 commit 6286ae9
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 0 deletions.
6 changes: 6 additions & 0 deletions include/linux/slab_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ static __always_inline void *kmalloc(size_t size, gfp_t flags)
if (!size)
return ZERO_SIZE_PTR;

if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE))
return NULL;

i = kmalloc_index(size);

#ifdef CONFIG_ZONE_DMA
Expand Down Expand Up @@ -172,6 +175,9 @@ static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node)
if (!size)
return ZERO_SIZE_PTR;

if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE))
return NULL;

i = kmalloc_index(size);

#ifdef CONFIG_ZONE_DMA
Expand Down
3 changes: 3 additions & 0 deletions mm/slab_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,9 @@ struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags)
{
int index;

if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE))
return NULL;

if (size <= 192) {
if (!size)
return ZERO_SIZE_PTR;
Expand Down

0 comments on commit 6286ae9

Please sign in to comment.