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/[email protected]
Signed-off-by: Uladzislau Rezki (Sony) <[email protected]>
Reported-by: [email protected]
Closes: https://lore.kernel.org/[email protected]
Reviewed-by: Anshuman Khandual <[email protected]>
Reviewed-by: Baoquan He <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
Uladzislau Rezki (Sony) authored and Andrew Morton committed 2026-08-24 18:43:02 -07:00
1 parent a44ab4bd1e
commit b9183788a2
1 file changed
+6 -7
+6 -7
View File
@@ -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);