On Mon, Aug 05, 2024 at 05:59:34PM +0300, Kirill A. Shutemov wrote: > Currently, the kernel only accepts memory in get_page_from_freelist(), > but there is another path that directly takes pages from free lists - > __alloc_page_bulk(). This function can consume all accepted memory and > will resort to __alloc_pages_noprof() if necessary. > > Conditionally accepted in __alloc_pages_bulk(). > > The same issue may arise due to deferred page initialization. Kick the > deferred initialization machinery before abandoning the zone, as the > kernel does in get_page_from_freelist(). > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> Acked-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx> > --- > mm/page_alloc.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index aa9b1eaa638c..90a1f01d5996 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -4576,12 +4576,25 @@ unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid, > goto failed; > } > > + cond_accept_memory(zone, 0); > +retry_this_zone: > mark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK) + nr_pages; > if (zone_watermark_fast(zone, 0, mark, > zonelist_zone_idx(ac.preferred_zoneref), > alloc_flags, gfp)) { > break; > } > + > + if (cond_accept_memory(zone, 0)) > + goto retry_this_zone; > + > +#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT > + /* Try again if zone has deferred pages */ > + if (deferred_pages_enabled()) { > + if (_deferred_grow_zone(zone, 0)) > + goto retry_this_zone; > + } > +#endif > } > > /* > -- > 2.43.0 >