mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
mm/vmalloc: do not warn on -ENOMEM from va_clip() in pcpu_get_vm_areas()
When pcpu_get_vm_areas() has to split a free vmap_area in the middle (NE_FIT_TYPE), va_clip() needs an extra vmap_area object. It takes the per-cpu ne_fit_preload_node if one is there, and otherwise falls back to kmem_cache_alloc(GFP_NOWAIT), which may fail and return -ENOMEM. pcpu_get_vm_areas() never preloads, and a single call can do more than one such split: on a NUMA system it places one area per node group, so the first split consumes the preloaded object and the next one depends on the GFP_NOWAIT allocation. That failure is expected and already handled: the recovery path returns the areas clipped so far to the free tree, purges lazily freed areas and retries. But the error is checked with WARN_ON_ONCE(), so a transient allocation failure under memory pressure or fault injection triggers a kernel warning, and a panic with panic_on_warn. syzbot hit this on a two-node VM while creating a per-cpu BPF array map. Keep the WARN_ON_ONCE() for errors other than -ENOMEM, which do indicate a bug, and take the recovery path either way. This matches what commitb9183788a2("mm/vmalloc: do not warn on -ENOMEM from va_alloc()") did for the other va_clip() caller. Link: https://lore.kernel.org/20260925205450.21262-1-raghunathpalla.0209@gmail.com Fixes:1b23ff80b3("mm/vmalloc: invoke classify_va_fit_type() in adjust_va_to_fit_type()") Signed-off-by: Palla Raghunath <raghunathpalla.0209@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reported-by: <syzbot+442828bb356b10813a47@syzkaller.appspotmail.com> Closes: https://syzkaller.appspot.com/bug?extid=442828bb356b10813a47 Reviewed-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Uladzislau Rezki (Sony) <urezki@gmail.com> Reviewed-by: Dev Jain <dev.jain@arm.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Brigham Campbell <me@brighamcampbell.com> Cc: Baoquan He <baoquan.he@linux.dev>
This commit is contained in:
parent
2e83e2ce34
commit
499baaff38
|
|
@ -5122,9 +5122,14 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
|
|||
|
||||
ret = va_clip(&free_vmap_area_root,
|
||||
&free_vmap_area_list, va, start, size);
|
||||
if (WARN_ON_ONCE(unlikely(ret)))
|
||||
/* It is a BUG(), but trigger recovery instead. */
|
||||
if (unlikely(ret)) {
|
||||
/*
|
||||
* -ENOMEM from the GFP_NOWAIT fallback is expected.
|
||||
* Anything else is a BUG(), but trigger recovery instead.
|
||||
*/
|
||||
WARN_ON_ONCE(ret != -ENOMEM);
|
||||
goto recovery;
|
||||
}
|
||||
|
||||
/* Allocated area. */
|
||||
va = vas[area];
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user