Skip to contentSkip to conversation

fs/proc/task_mmu: convert hugetlb functions to work on folis

PATCH Applied David Hildenbrand 2 participants 7 messages Apr 17, 2024

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

cover fs/proc/task_mmu: convert hugetlb functions to work on folis

Let's convert two more functions, getting rid of two more page_mapcount() calls.

Cc Andrew Morton <[email protected]>
Cc Muchun Song <[email protected]>

David Hildenbrand (2):
fs/proc/task_mmu: convert pagemap_hugetlb_range() to work on folios fs/proc/task_mmu: convert smaps_hugetlb_range() to work on folios

 fs/proc/task_mmu.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)
Signature · 1 line
2.44.0
#1 lore raw

PATCH 1/2 fs/proc/task_mmu: convert pagemap_hugetlb_range() to work on folios

Let's get rid of another page_mapcount() check and simply use folio_likely_mapped_shared(), which is precise for hugetlb folios.

While at it, also check for PMD table sharing, like we do in smaps_hugetlb_range().

No functional change intended, except that we would now detect hugetlb folios shared via PMD table sharing correctly.

---
 fs/proc/task_mmu.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
fs/proc/task_mmu.c +4 -3
index 8ff79bd427ec6..cd6e45e0cde8e 100644
@@ -1578,12 +1578,13 @@ static int pagemap_hugetlb_range(pte_t *ptep, unsigned long hmask,
 
 	pte = huge_ptep_get(ptep);
 	if (pte_present(pte)) {
-		struct page *page = pte_page(pte);
+		struct folio *folio = page_folio(pte_page(pte));
 
-		if (!PageAnon(page))
+		if (!folio_test_anon(folio))
 			flags |= PM_FILE;
 
-		if (page_mapcount(page) == 1)
+		if (!folio_likely_mapped_shared(folio) &&
+		    !hugetlb_pmd_shared(ptep))
 			flags |= PM_MMAP_EXCLUSIVE;
 
 		if (huge_pte_uffd_wp(pte))
Signature · 1 line
2.44.0
Reviewed-by on v1 1/2
#2 lore raw

Re: [PATCH v1 1/2] fs/proc/task_mmu: convert pagemap_hugetlb_range() to work on folios

Quoted 10 lines · David Hildenbrand

Let's get rid of another page_mapcount() check and simply use folio_likely_mapped_shared(), which is precise for hugetlb folios.

While at it, also check for PMD table sharing, like we do in smaps_hugetlb_range().

No functional change intended, except that we would now detect hugetlb folios shared via PMD table sharing correctly.

Signature · 2 lines
Oscar Salvador
SUSE Labs
#3 lore raw

PATCH 2/2 fs/proc/task_mmu: convert smaps_hugetlb_range() to work on folios

In reply to David Hildenbrand

Let's get rid of another page_mapcount() check and simply use folio_likely_mapped_shared(), which is precise for hugetlb folios.

While at it, use huge_ptep_get() + pte_page() instead of ptep_get() + vm_normal_page(), just like we do in pagemap_hugetlb_range().

No functional change intended.

---
 fs/proc/task_mmu.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
fs/proc/task_mmu.c +7 -6
index cd6e45e0cde8e..f4259b7edfded 100644
@@ -730,19 +730,20 @@ static int smaps_hugetlb_range(pte_t *pte, unsigned long hmask,
 {
 	struct mem_size_stats *mss = walk->private;
 	struct vm_area_struct *vma = walk->vma;
-	struct page *page = NULL;
-	pte_t ptent = ptep_get(pte);
+	pte_t ptent = huge_ptep_get(pte);
+	struct folio *folio = NULL;
 
 	if (pte_present(ptent)) {
-		page = vm_normal_page(vma, addr, ptent);
+		folio = page_folio(pte_page(ptent));
 	} else if (is_swap_pte(ptent)) {
 		swp_entry_t swpent = pte_to_swp_entry(ptent);
 
 		if (is_pfn_swap_entry(swpent))
-			page = pfn_swap_entry_to_page(swpent);
+			folio = pfn_swap_entry_folio(swpent);
 	}
-	if (page) {
-		if (page_mapcount(page) >= 2 || hugetlb_pmd_shared(pte))
+	if (folio) {
+		if (folio_likely_mapped_shared(folio) ||
+		    hugetlb_pmd_shared(pte))
 			mss->shared_hugetlb += huge_page_size(hstate_vma(vma));
 		else
 			mss->private_hugetlb += huge_page_size(hstate_vma(vma));
Signature · 1 line
2.44.0
Reviewed-by on v1 2/2
#4 lore raw

Re: [PATCH v1 2/2] fs/proc/task_mmu: convert smaps_hugetlb_range() to work on folios

Quoted 5 lines · David Hildenbrand

Let's get rid of another page_mapcount() check and simply use folio_likely_mapped_shared(), which is precise for hugetlb folios.

While at it, use huge_ptep_get() + pte_page() instead of ptep_get() + vm_normal_page(), just like we do in pagemap_hugetlb_range().

That is fine because vm_normal_page() tries to be clever about mappings which hugetlb does not support, right?

Quoted 4 lines

No functional change intended.

Signature · 2 lines
Oscar Salvador
SUSE Labs
#5 lore raw

Re: [PATCH v1 2/2] fs/proc/task_mmu: convert smaps_hugetlb_range() to work on folios

Quoted 9 lines · Oscar Salvador
Quoted 5 lines · David Hildenbrand

Let's get rid of another page_mapcount() check and simply use folio_likely_mapped_shared(), which is precise for hugetlb folios.

While at it, use huge_ptep_get() + pte_page() instead of ptep_get() + vm_normal_page(), just like we do in pagemap_hugetlb_range().

That is fine because vm_normal_page() tries to be clever about mappings which hugetlb does not support, right?

Right, using vm_normal_page() is even completely bogus. Usually (but not always) we have PMDs/PUDs and not PTEs for mapping hugetlb pages -- where vm_normal_folio_pmd() would be the right thing to do.

That's also the reason why hugetlb.c has not a single user of vm_normal_page() and friends ... it doesn't apply to hugetlb, but likely also isn't currently harmful to use it.

Signature · 3 lines
Cheers,

David / dhildenb
#6 lore raw

Re: [PATCH v1 2/2] fs/proc/task_mmu: convert smaps_hugetlb_range() to work on folios

Quoted 11 lines · David Hildenbrand
Quoted 9 lines · Oscar Salvador
Quoted 5 lines · David Hildenbrand

Let's get rid of another page_mapcount() check and simply use folio_likely_mapped_shared(), which is precise for hugetlb folios.

While at it, use huge_ptep_get() + pte_page() instead of ptep_get() + vm_normal_page(), just like we do in pagemap_hugetlb_range().

That is fine because vm_normal_page() tries to be clever about mappings which hugetlb does not support, right?

Quoted 7 lines

Right, using vm_normal_page() is even completely bogus. Usually (but not always) we have PMDs/PUDs and not PTEs for mapping hugetlb pages -- where vm_normal_folio_pmd() would be the right thing to do.

That's also the reason why hugetlb.c has not a single user of vm_normal_page() and friends ... it doesn't apply to hugetlb, but likely also isn't currently harmful to use it.

I guess not because we skip the special handling, but I agree that replacing it is the right thing to do.
Thanks for explaining!

Signature · 2 lines
Oscar Salvador
SUSE Labs