Re: [PATCH v2 1/2] mm/huge_memory.c: skip zero-page remapping when underused THP shrinker is disabled

From: Nico Pache

Date: Mon Oct 26 2026 - 16:02:35 EST




On 10/25/26 10:52 PM, Barry Song wrote:
On Mon, Oct 26, 2026 at 5:48 AM Nico Pache <nico.pache@xxxxxxxxx> wrote:



On 10/25/26 2:28 PM, Barry Song wrote:
On Mon, Oct 26, 2026 at 1:40 AM Nico Pache (Red Hat)
<nico.pache@xxxxxxxxx> wrote:

The zero-page remapping in __folio_split() was added to support the
underused THP shrinker. When the shrinker is disabled via
shrink_underused, gate TTU_USE_SHARED_ZEROPAGE on split_underused_thp
to avoid scanning subpages for zero content unnecessarily.

Suggested-by: David Hildenbrand <david@xxxxxxxxxx>
Fixes: b1f202060afe ("mm: remap unused subpages to shared zeropage when splitting isolated thp")
Signed-off-by: Nico Pache <nico.pache@xxxxxxxxx>

is b1f202060afe a correct fixes tag? as
commit b1f202060afe has no even "split_underused_thp" there.

I believe so. IIUC these two series were merged together. While
81d3ff3c6f7 introduces the toggle, b1f202060afe is where the behavior
started.

I guess you could argue that the Fixes should include both?

Not entirely sure!

Thanks for the clarification. I guess it's fine.

BTW, with the code below, we no longer add fully mapped
folios to deferred_split_folio. So the scanning code only
handles partially mapped folios to set up zero-page mappings
for their subpages.

I'm still not quite sure whether this is really harmful, though.
Am I missing something, or was there some discussion I missed?

The issue is not in the actual shrinker code or the deferred split list.

The issue is that any split leads to this zero-page remapping indiscriminate of the actual toggle. The same way this toggle is gating things going on the deferred split list, we should be gating the actual zero-page remapping too.

There were two pieces to the underutilized shrinker, first we check if a THP is underutilized, if so we split, and the split+remapping handles the freeing of that memory. However, functionally this also made ANY split do this zero page remapping, not just those coming from the shrinker.

-- Nico


void deferred_split_folio(struct folio *folio, bool partially_mapped)
{
...
/*
* Order 1 folios have no space for a deferred list, but we also
* won't waste much memory by not adding them to the deferred list.
*/
if (folio_order(folio) <= 1)
return;

if (!partially_mapped && !split_underused_thp)
return;
}