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

Johannes Weiner <[email protected]> Tue, 4 Aug 2026 10:03:41 -0400
Newsgroups org.kvack.linux-mm
Message-ID <[email protected]>
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:
> >
> [...]
> > >
> > > #define LARGE_FOLIO_ZERO_SCAN_MIN_SIZE SZ_2M
> > >
> > > if (folio_size(folio) >= LARGE_FOLIO_ZERO_SCAN_MIN_SIZE)
> > >      deferred_split_folio(folio, false);
> > >
> > > If, someday, people find that 1 MiB also helps, they can provide
> > > data to support it.
> >
> > 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.

No new sysctls. No new policy hardcoded in kernel code. Default
behavior remains unchanged.