On 8/9/24 06:48, 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(). Is the deferred page init issue an existing problem? In other words, should it be a separate patch with a Fixes: tag so it can go back to stable kernels? Thanks, Tom > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > Acked-by: David Hildenbrand <david@xxxxxxxxxx> > --- > mm/page_alloc.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index f7bb885aab07..ed62ecd6775f 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -4613,12 +4613,23 @@ 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; > + > + /* Try again if zone has deferred pages */ > + if (deferred_pages_enabled()) { > + if (_deferred_grow_zone(zone, 0)) > + goto retry_this_zone; > + } > } > > /*