1. The RFC v2 way, which is head-only, and we increment the compound
mapcount for each PT mapping we have. So a PTE-mapped 2M page,
compound_mapcount=512, subpage->_mapcount=0 (ignoring the -1 bias).
2. The THP-like way. If we are fully mapping the hugetlb page with the
hstate-level PTE, we increment the compound mapcount, otherwise we
increment subpage->_mapcount.
3. The RFC v1 way (the way you have suggested above), which is
head-only, and we increment the compound mapcount if the hstate-level
PTE is made present.
With #1 and #2, there is no concern with folio_mapcount(). But with
#3, folio_mapcount() for a PTE-mapped 2M page mapped in a single VMA
would yield 1 instead of 512 (right?). That's what I mean.
My 2 cents:
The mapcount is primarily used (in hugetlb context) to
(a) Detect if a page might be shared. mapcount > 1 implies that two
independent page table hierarchies are mapping the page. We care about
mapcount == 1 vs. mapcount != 1.
(b) Detect if unmapping was sucessfull. We care about mapcount == 0 vs.
mapcount != 0.
For hugetlb, I don't see why we should care about the subpage mapcount
at all.
Agreed -- it shouldn't really matter all that much.
For (a) it's even good to count "somehow mapped into a single page table
structure" as "mapcount == 1" For (b), we don't care as long as "still
mapped" implies "mapcount != 0".
Thanks for your thoughts, David. So it sounds like you're still
squarely in the #3 camp. :)
Well, yes. As long as we can get it implemented in a clean way ... :)
--
Thanks,
David / dhildenb