On 2024/07/31 14:05, Barry Song wrote:
> Jason,
> Thank you very much. Also, Tetsuo reminded me that kmalloc_array() might be
> problematic if the count is too large:
> pages = kmalloc_array(count, sizeof(*pages), GFP_KERNEL | __GFP_NOFAIL);
If "count" is guaranteed to be count <= 16, this might be tolerable.
Consider a situation where current thread was chosen as an global OOM victim.
Trying to allocate "count" pages using
for (i = 0; i < count; i++)
pages[i] = alloc_page(GFP_KERNEL | __GFP_NOFAIL);
is not good.
>
> You might want to consider using vmalloc_array() or kvmalloc_array() instead
> when you send a new version.
There is a limitation at
https://elixir.bootlin.com/linux/v6.11-rc1/source/mm/page_alloc.c#L3033
that you must satisfy count <= PAGE_SIZE * 2 / sizeof(*pages) if you use
__GFP_NOFAIL.
But as already explained above, allocating 1024 pages (assuming PAGE_SIZE is
4096 and
pointer size is 8) when current thread was chosen as an OOM victim is not
recommended.
You should implement proper error handling instead of using __GFP_NOFAIL if
count can
become large.