mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
mm/vmalloc: do not warn on -ENOMEM from va_alloc()
Since vmalloc() accepts non-blocking GFP flags, allocation requests may fail when callers pass restrictive GFP masks. va_clip() may return -ENOMEM when its GFP_NOWAIT fallback allocation fails during NE_FIT_TYPE splitting. This is an expected failure, so va_alloc() should return the error without triggering a kernel splat. Link: https://lore.kernel.org/20260802104627.63892-1-urezki@gmail.com Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> Reported-by: syzbot+61c997e6be1d9bb300ba@syzkaller.appspotmail.com Closes: https://lore.kernel.org/6a6d3cbd.6ce73036.24301b.000e.GAE@google.com Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com> Reviewed-by: Baoquan He <baoquan.he@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
a44ab4bd1e
commit
b9183788a2
13
mm/vmalloc.c
13
mm/vmalloc.c
|
|
@ -1840,8 +1840,10 @@ va_alloc(struct vmap_area *va,
|
|||
|
||||
/* Update the free vmap_area. */
|
||||
ret = va_clip(root, head, va, nva_start_addr, size);
|
||||
if (WARN_ON_ONCE(ret))
|
||||
if (ret) {
|
||||
WARN_ON_ONCE(ret != -ENOMEM);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return nva_start_addr;
|
||||
}
|
||||
|
|
@ -1914,12 +1916,9 @@ preload_this_cpu_lock(spinlock_t *lock, gfp_t gfp_mask, int node)
|
|||
|
||||
/*
|
||||
* Preload this CPU with one extra vmap_area object. It is used
|
||||
* when fit type of free area is NE_FIT_TYPE. It guarantees that
|
||||
* a CPU that does an allocation is preloaded.
|
||||
*
|
||||
* We do it in non-atomic context, thus it allows us to use more
|
||||
* permissive allocation masks to be more stable under low memory
|
||||
* condition and high memory pressure.
|
||||
* when fit type of free area is NE_FIT_TYPE. It is best effort
|
||||
* pre-loading. If it fails va_clip() may return -ENOMEM from its
|
||||
* GFP_NOWAIT fallback.
|
||||
*/
|
||||
if (!this_cpu_read(ne_fit_preload_node))
|
||||
va = kmem_cache_alloc_node(vmap_area_cachep, gfp_mask, node);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user