fs/proc/task_mmu: convert hugetlb functions to work on folis
Subsystems (4)
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.
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
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
@@ -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
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 usefolio_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.
Signed-off-by David Hildenbrand <[email protected]>
Signature · 2 lines
Oscar Salvador SUSE Labs
PATCH 2/2 fs/proc/task_mmu: convert smaps_hugetlb_range() to work on folios
In reply to David HildenbrandLet'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
@@ -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
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 usefolio_likely_mapped_shared(), which is precise for hugetlb folios.While at it, use
huge_ptep_get()+pte_page()instead ofptep_get()+vm_normal_page(), just like we do inpagemap_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.
Signed-off-by David Hildenbrand <[email protected]>
Signature · 2 lines
Oscar Salvador SUSE Labs
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 usefolio_likely_mapped_shared(), which is precise for hugetlb folios.While at it, use
huge_ptep_get()+pte_page()instead ofptep_get()+vm_normal_page(), just like we do inpagemap_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
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 usefolio_likely_mapped_shared(), which is precise for hugetlb folios.While at it, use
huge_ptep_get()+pte_page()instead ofptep_get()+vm_normal_page(), just like we do inpagemap_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 -- wherevm_normal_folio_pmd()would be the right thing to do.That's also the reason why
hugetlb.chas not a single user ofvm_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