On Wed, 24. Jul 21:02, Matthew Wilcox wrote: > On Thu, Jul 25, 2024 at 02:28:27AM +0800, Hailong.Liu wrote: > > > if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMALLOC) || > > > - page_shift == PAGE_SHIFT) > > > - return vmap_small_pages_range_noflush(addr, end, prot, pages); > > > + page_shift == PAGE_SHIFT || > > > + page_private(pages[0]) == VM_AREA_ALLOC_PAGES_FALLBACK) { > > > + int ret = vmap_small_pages_range_noflush(addr, end, prot, pages); > > > + > > > + set_page_private(pages[0], 0); > > > + return ret; > > > + } > > > > > > for (i = 0; i < nr; i += 1U << (page_shift - PAGE_SHIFT)) { > > > int err; > > > @@ -3583,6 +3590,7 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > > > > > > /* fall back to the zero order allocations */ > > > alloc_gfp |= __GFP_NOFAIL; > > > + fallback = true; > > Sry for my mistake, I forget define fallback here. > > BTW, This is not the optimal solution. Does anyone have a better idea? Glad to > > hear:) > > Yeah, I really don't like this approach. You could return a small > struct indicating both nr_allocated and whether you had to fall back. > Or you could pass a bool * parameter. They're both pretty nasty. Agree. Thanks for pointing out. I send a rfc-v2 patch with a different solution. pls help review. https://lore.kernel.org/all/20240725035318.471-1-hailong.liu@xxxxxxxx/T/#u -- help you, help me, Hailong.