diff options
author | Christoph Lameter <cl@linux.com> | 2013-05-03 11:43:18 -0400 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2013-05-06 02:24:16 -0400 |
commit | 6286ae97d10ea2b5cd90532163797ab217bfdbdf (patch) | |
tree | 0724efb47d735ce835709d2402de02de4dd61f07 /include/linux/slab_def.h | |
parent | 14e50c6a9bc2b283bb4021026226268312ceefdd (diff) |
slab: Return NULL for oversized allocations
The inline path seems to have changed the SLAB behavior for very large
kmalloc allocations with commit e3366016 ("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>
Diffstat (limited to 'include/linux/slab_def.h')
-rw-r--r-- | include/linux/slab_def.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h index 113ec080313f..cd401580bdd3 100644 --- a/include/linux/slab_def.h +++ b/include/linux/slab_def.h | |||
@@ -126,6 +126,9 @@ static __always_inline void *kmalloc(size_t size, gfp_t flags) | |||
126 | if (!size) | 126 | if (!size) |
127 | return ZERO_SIZE_PTR; | 127 | return ZERO_SIZE_PTR; |
128 | 128 | ||
129 | if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE)) | ||
130 | return NULL; | ||
131 | |||
129 | i = kmalloc_index(size); | 132 | i = kmalloc_index(size); |
130 | 133 | ||
131 | #ifdef CONFIG_ZONE_DMA | 134 | #ifdef CONFIG_ZONE_DMA |
@@ -172,6 +175,9 @@ static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node) | |||
172 | if (!size) | 175 | if (!size) |
173 | return ZERO_SIZE_PTR; | 176 | return ZERO_SIZE_PTR; |
174 | 177 | ||
178 | if (WARN_ON_ONCE(size > KMALLOC_MAX_SIZE)) | ||
179 | return NULL; | ||
180 | |||
175 | i = kmalloc_index(size); | 181 | i = kmalloc_index(size); |
176 | 182 | ||
177 | #ifdef CONFIG_ZONE_DMA | 183 | #ifdef CONFIG_ZONE_DMA |