From: "David Hildenbrand (Arm)" <david@kernel.org>
To: "Jose A. Perez de Azpillaga" <azpijr@gmail.com>,
Zi Yan <ziy@nvidia.com>,
Andrew Morton <akpm@linux-foundation.org>,
Lorenzo Stoakes <ljs@kernel.org>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>,
"Liam R. Howlett" <liam@infradead.org>,
Nico Pache <nico.pache@linux.dev>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Usama Arif <usama.arif@linux.dev>,
Kiryl Shutsemau <kas@kernel.org>, Rik van Riel <riel@surriel.com>,
Vlastimil Babka <vbabka@kernel.org>, Harry Yoo <harry@kernel.org>,
Jann Horn <jannh@google.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Joanne Koong <joannelkoong@gmail.com>
Subject: Re: [RFC PATCH 0/2] mm/huge_memory: find partially mapped shared folios with NO_PAGE_MAPCOUNT
Date: Fri, 13 Nov 2026 21:16:33 +0100 [thread overview]
Message-ID: <3744f956-8179-45f3-9d87-c99c82b2f8db@kernel.org> (raw)
In-Reply-To: <e9033159-ffd5-4c84-b355-964687b75226@gmail.com>
On 11/12/26 14:03, Jose A. Perez de Azpillaga wrote:
> On 11/12/26 1:46 PM, David Hildenbrand (Arm) wrote:
>> On 11/11/26 12:31, Jose A. Perez de Azpillaga wrote:
>>> With CONFIG_NO_PAGE_MAPCOUNT, an anon large folio mapped by several MMs
>>> isn't seen as partially mapped while its mapcount stays at or above the
>>> number of pages. If parent and child zap the same half of a THP after
>>> fork(), that half is mapped by nobody, the folio is never queued for
>>> deferred split, and the memory stays allocated until every mapper is
>>> gone.
>>
>> If you follow the history on this, in e.g., some raised in my talk
>>
>> https://share.daveh.de/s/bQsDpD7xigJ6wD8/download?path=&files=LSF_MM%2726_+Deferred_folio_splitting.pdf
>>
>> There are a lot of questions around this.
>>
>> In particular
>>
>> (a) Is it really relevant in practice. The only way you can trigger this if a
>> folio becomes partially mapped *after* fork (by parent and child unmapping the
>> same pages), and the child stays alive. Once the child is gone, the folio is
>> only mapped by one process (e.g., child quit), the folio is properly detected as
>> partially mapped.
>
> I don't have any relevant evidence in practice. found it by just reading
> and testing in qemu. that is why I sent it as RFC.
Ok. Because I would really be interested in real-life scenarios where it is a
problem.
It's only relevant for long-running parent+child combinations. For short-lived
children (e.g., fork+exec) it's irrelevant.
>
>>
>> So you need a long-running parent+child, and have them both do questionable things.
>>
>> (b) What is the overhead from having way too many folios in the deferred split list.
>>
>
> I don't know yet. I only measured the walk in a TCG guest, nothing on
> how long the list gets
That would be really interesting. I assume there are some cases where a simple
fork+exec would already add pages to the deferred split list even thought they
are briefly after fully mapped by the parent.
>
>>>
>>> Patch 1 moves the split_underused_thp check out of
>>> deferred_split_folio(). Patch 2 queues such folios as candidates and has
>>> the shrinker walk the rmap to see which pages are still mapped.
>>>
>>> 512 MB of THPs with the same half zapped by every mapper, memory freed
>>> by the shrinker:
>>>
>>> before after
>>> 2M, 2 processes 0 MB 252 MB
>>> 2M, 3 processes 0 MB 237 MB
>>> 2M, 2 children + parent PMD 0 MB 244 MB
>>> 64K, 2 processes 0 MB 252 MB
>>> 64K, 3 processes 0 MB 252 MB
>>>
>>
>> Again, we can create nice scenarios that are likely not relevant in practice
>> (such as 512 MB THPs, lol), but so far I doubted that this is relevant in practice.
>
> that's 512 MB in total, not the folio size. maybe I should have
> clarified it.
Ah, 512MiB of THPs, not 512MB THP, Yes, that makes sense.
[...]
>>
>> Maybe one could track it a bit broader? "any page in this set of 16 pages is
>> present". Reclaiming a single 4k page from a 2M folios is barely worth it.
>>
>
> yes, that works. maybe with the group size scaled to the folio, so the
> map is one long on the stack and 64K folio still gets one bit per page?
>
As an alternative, could we also just look for the next page incrementally?
Like, start with offset 0. When we see that, move to offset 1, when we see that,
move to offset 2 ... and once we saw all pages that way, stop the walk.
I'd assume that, as long as VMAs don't get remapped, that should likely work in
most cases, right?
> however, maybe if I don't have real evidence, better drop it?
I'd be very interested in an efficient way to test if a folio is partially
mapped, and where the holes are.
Knowing about the holes could guide a targeted buddy-like folio split.
There was also the idea of letting folio_referenced() for that purpose, when we
area already doing an rmap walk.
--
Cheers,
David
next prev parent reply other threads:[~2026-11-13 20:16 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-11 11:31 [RFC PATCH 0/2] mm/huge_memory: find partially mapped shared folios with NO_PAGE_MAPCOUNT Jose A. Perez de Azpillaga
2026-11-11 11:31 ` [RFC PATCH 1/2] mm/huge_memory: check split_underused_thp in the caller of deferred_split_folio() Jose A. Perez de Azpillaga
2026-11-11 11:31 ` [RFC PATCH 2/2] mm/huge_memory: detect partially mapped shared folios without per-page mapcounts Jose A. Perez de Azpillaga
2026-11-12 11:36 ` sashiko-bot
2026-11-12 12:43 ` Jose A. Perez de Azpillaga
2026-11-12 12:46 ` [RFC PATCH 0/2] mm/huge_memory: find partially mapped shared folios with NO_PAGE_MAPCOUNT David Hildenbrand (Arm)
2026-11-12 13:03 ` Jose A. Perez de Azpillaga
2026-11-13 20:16 ` David Hildenbrand (Arm) [this message]
2026-11-14 12:46 ` Jose A. Perez de Azpillaga
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3744f956-8179-45f3-9d87-c99c82b2f8db@kernel.org \
--to=david@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=azpijr@gmail.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=dev.jain@arm.com \
--cc=harry@kernel.org \
--cc=jannh@google.com \
--cc=joannelkoong@gmail.com \
--cc=kas@kernel.org \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=nico.pache@linux.dev \
--cc=riel@surriel.com \
--cc=ryan.roberts@arm.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.