summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorzhenwei pi <pizhenwei@bytedance.com>2022-04-07 14:40:08 +0800
committerMatthew Wilcox (Oracle) <willy@infradead.org>2022-04-07 10:11:20 -0400
commit98ea02597b9967c0817d29fee2f96d21b9e59ca5 (patch)
tree99da71c406f2e47fa427ce62d21155ccf7637536 /mm
parentec4858e07ed62eceb60bac2ded3c0d6e2471c66b (diff)
downloadlwn-98ea02597b9967c0817d29fee2f96d21b9e59ca5.tar.gz
lwn-98ea02597b9967c0817d29fee2f96d21b9e59ca5.zip
mm/rmap: Fix handling of hugetlbfs pages in page_vma_mapped_walk
page_mapped_in_vma() sets nr_pages to 1, which is usually correct as we only want to know about the precise page and not about other pages in the folio. However, hugetlbfs does want to know about the entire hpage, and using nr_pages to get the size of the hpage is wrong. We could change page_mapped_in_vma() to special-case hugetlbfs pages, but it's better to ignore nr_pages in page_vma_mapped_walk() and get the size from the VMA instead. Fixes: 2aff7a4755bed ("mm: Convert page_vma_mapped_walk to work on PFNs") Signed-off-by: zhenwei pi <pizhenwei@bytedance.com> Reviewed-by: Muchun Song <songmuchun@bytedance.com> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> [edit commit message, use hstate directly]
Diffstat (limited to 'mm')
-rw-r--r--mm/page_vma_mapped.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 1187f9c1ec5b..14a5cda73dee 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -163,7 +163,8 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
return not_found(pvmw);
if (unlikely(is_vm_hugetlb_page(vma))) {
- unsigned long size = pvmw->nr_pages * PAGE_SIZE;
+ struct hstate *hstate = hstate_vma(vma);
+ unsigned long size = huge_page_size(hstate);
/* The only possible mapping was handled on last iteration */
if (pvmw->pte)
return not_found(pvmw);
@@ -173,8 +174,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
if (!pvmw->pte)
return false;
- pvmw->ptl = huge_pte_lockptr(size_to_hstate(size), mm,
- pvmw->pte);
+ pvmw->ptl = huge_pte_lockptr(hstate, mm, pvmw->pte);
spin_lock(pvmw->ptl);
if (!check_pte(pvmw))
return not_found(pvmw);