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.