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.