Re: [PATCH v1 2/2] mm/memory: add anonymous mTHP folios to deferred split list

Johannes Weiner <[email protected]> Tue, 4 Aug 2026 14:54:11 -0400
Newsgroups org.kvack.linux-mm
Message-ID <[email protected]>
On Tue, Aug 04, 2026 at 04:11:02PM +0200, David Hildenbrand (Arm) wrote:
> On 8/4/26 16:03, Johannes Weiner wrote:
> > On Tue, Aug 04, 2026 at 10:03:14AM +0800, Barry Song wrote:
> >> On Tue, Aug 4, 2026 at 8:48 AM Johannes Weiner <[email protected]> wrote:
> >>>
> >> [...]
> >>>
> >>> I am very confused. Did you not see my proposal above?
> >>>
> >>> Why not this?
> >>
> >> Hi Johannes,
> >>
> >> For arm64, if the base page size is 64KB, a PMD would be 512MB,
> >> and PMD-1 would be 256MB. Usama mentioned 2MB, which is just
> >> order-5, not PMD-1 on arm64.
> >>
> >> BTW, I assume khugepaged_max_ptes_none is intended for collapse,
> >> not splitting. I am a bit concerned that reusing it for this
> >> purpose would be quite disruptive.
> > 
> > It already is:
> > 
> > static bool thp_underused(struct folio *folio)
> > {
> > 	int num_zero_pages = 0, num_filled_pages = 0;
> > 	int i;
> > 
> > 	if (khugepaged_max_ptes_none == HPAGE_PMD_NR - 1)
> > 		return false;
> > 
> > 	if (folio_contain_hwpoisoned_page(folio))
> > 		return false;
> > 
> > 	for (i = 0; i < folio_nr_pages(folio); i++) {
> > 		if (pages_identical(folio_page(folio, i), ZERO_PAGE(0))) {
> > 			if (++num_zero_pages > khugepaged_max_ptes_none)
> > 				return true;
> > 		} else {
> > 			/*
> > 			 * Another path for early exit once the number
> > 			 * of non-zero filled pages exceeds threshold.
> > 			 */
> > 			if (++num_filled_pages >= HPAGE_PMD_NR - khugepaged_max_ptes_none)
> > 				return false;
> > 		}
> > 	}
> > 	return false;
> > }
> > 
> > That's ABI and setups are relying on it.
> > 
> > All I'm proposing is to only queue pages that the shrinker would
> > actually split under currently existing rules. That's a mostly
> > transparent optimization, not a new policy.
> 
> I yet have to reply to some stuff here (sorry, it's a mess :( ), but one thing
> that annoyed me right from the start is that we have:
> 
> static bool split_underused_thp = true;
> 
> But the default khugepaged settings actually don't result in any splits.
> 
> I think it would already be a big improvement to not default to adding all pages
> in default setups.
> 
> When we last discussed changing that, one concern raised in the past was that
> changing the khugepaged setting later would then not be able to reclaim pages
> allocated up to that point.

Agree, that could be unexpected.

> When someone actually changes khugepaged settings such that the underused
> shrinker would get active, could we walk the LRU and add all eligible anon THPs
> to the underused shrinker? We could remember "already scanned for underused" per
> THP, but maybe we could avoid that initially.

Recovery like that makes sense to me. I don't think we have to be
extremely performant either, that should be a rare setting change.

Would it make sense to use khugepaged_scan.mm_head? That could be more
targeted when policy == madvise, easier to skip over shmem VMAs etc.