mm: don't warn about large allocations for slab
Subsystems (2)
PATCH v2 1/1 mm: don't warn about large allocations for slab
From: Dmitry Vyukov <[email protected]>
Slub does not call kmalloc_slab() for sizes > KMALLOC_MAX_CACHE_SIZE, instead it falls back to kmalloc_large().
For slab KMALLOC_MAX_CACHE_SIZE == KMALLOC_MAX_SIZE and it calls kmalloc_slab() for all allocations relying on NULL return value for over-sized allocations.
This inconsistency leads to unwanted warnings from kmalloc_slab() for over-sized allocations for slab. Returning NULL for failed allocations is the expected behavior.
Make slub and slab code consistent by checking size > KMALLOC_MAX_CACHE_SIZE in slab before calling kmalloc_slab().
While we are here also fix the check in kmalloc_slab(). We should check against KMALLOC_MAX_CACHE_SIZE rather than KMALLOC_MAX_SIZE. It all kinda worked because for slab the constants are the same, and slub always checks the size against KMALLOC_MAX_CACHE_SIZE before kmalloc_slab().
But if we get there with size > KMALLOC_MAX_CACHE_SIZE anyhow bad things will happen. For example, in case of a newly introduced bug in slub code.
Also move the check in kmalloc_slab() from function entry to the size > 192 case. This partially compensates for the additional check in slab code and makes slub code a bit faster
(at least theoretically).
Also drop __GFP_NOWARN in the warning check.
This warning means a bug in slab code itself,
user-passed flags have nothing to do with it.
Nothing of this affects slob.
---
Changes since v1:
- everything has changed, re-review
--- mm/slab.c | 4 ++++ mm/slab_common.c | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-)
mm/slab.c +4 -0
@@ -3675,6 +3675,8 @@ __do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller)struct kmem_cache *cachep;void *ret; +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) +return NULL ; cachep =kmalloc_slab (size, flags);if (unlikely (ZERO_OR_NULL_PTR (cachep)))return cachep;
@@ -3710,6 +3712,8 @@ static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,struct kmem_cache *cachep;void *ret; +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) +return NULL ; cachep =kmalloc_slab (size, flags);if (unlikely (ZERO_OR_NULL_PTR (cachep)))return cachep;
mm/slab_common.c +6 -6
@@ -1023,18 +1023,18 @@ struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags) {unsigned int index; -if (unlikely (size >KMALLOC_MAX_SIZE )) { -WARN_ON_ONCE (!(flags & __GFP_NOWARN)); -return NULL ; - } -if (size <=192 ) {if (!size)return ZERO_SIZE_PTR ; index = size_index[size_index_elem (size)]; - }else + }else { +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) { +WARN_ON (1 ); +return NULL ; + } index =fls (size -1 ); + }return kmalloc_caches[kmalloc_type (flags)][index]; }
Signature · 1 line
2.19.0.605.g01d371f741-goog
Quoted 34 lines · Dmitry Vyukov
From: Dmitry Vyukov <[email protected]>
Slub does not call
kmalloc_slab()for sizes >KMALLOC_MAX_CACHE_SIZE, instead it falls back tokmalloc_large().
For slabKMALLOC_MAX_CACHE_SIZE==KMALLOC_MAX_SIZEand it callskmalloc_slab()for all allocations relying on NULL return value for over-sized allocations.
This inconsistency leads to unwanted warnings fromkmalloc_slab()for over-sized allocations for slab. Returning NULL for failed allocations is the expected behavior.Make slub and slab code consistent by checking size >
KMALLOC_MAX_CACHE_SIZEin slab before callingkmalloc_slab().While we are here also fix the check in
kmalloc_slab(). We should check againstKMALLOC_MAX_CACHE_SIZErather thanKMALLOC_MAX_SIZE. It all kinda worked because for slab the constants are the same, and slub always checks the size againstKMALLOC_MAX_CACHE_SIZEbeforekmalloc_slab().
But if we get there with size >KMALLOC_MAX_CACHE_SIZEanyhow bad things will happen. For example, in case of a newly introduced bug in slub code.Also move the check in
kmalloc_slab()from function entry to the size > 192 case. This partially compensates for the additional check in slab code and makes slub code a bit faster
(at least theoretically).Also drop
__GFP_NOWARNin the warning check.
This warning means a bug in slab code itself,
user-passed flags have nothing to do with it.Nothing of this affects slob.
Quoted 13 lines
Signed-off-by Dmitry Vyukov <[email protected]>Cc Christoph Lameter <[email protected]>Cc Pekka Enberg <[email protected]>Cc David Rientjes <[email protected]>Cc Joonsoo Kim <[email protected]>Cc Andrew Morton <[email protected]>Reported-by [email protected]Reported-by [email protected]Reported-by [email protected]Reported-by [email protected]Reported-by [email protected]