hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/mm/page_vma_mapped.c
....@@ -52,12 +52,16 @@
5252 return true;
5353 }
5454
55
-static inline bool pfn_in_hpage(struct page *hpage, unsigned long pfn)
55
+static inline bool pfn_is_match(struct page *page, unsigned long pfn)
5656 {
57
- unsigned long hpage_pfn = page_to_pfn(hpage);
57
+ unsigned long page_pfn = page_to_pfn(page);
58
+
59
+ /* normal page and hugetlbfs page */
60
+ if (!PageTransCompound(page) || PageHuge(page))
61
+ return page_pfn == pfn;
5862
5963 /* THP can be referenced by any subpage */
60
- return pfn >= hpage_pfn && pfn - hpage_pfn < hpage_nr_pages(hpage);
64
+ return pfn >= page_pfn && pfn - page_pfn < thp_nr_pages(page);
6165 }
6266
6367 /**
....@@ -108,7 +112,7 @@
108112 pfn = pte_pfn(*pvmw->pte);
109113 }
110114
111
- return pfn_in_hpage(pvmw->page, pfn);
115
+ return pfn_is_match(pvmw->page, pfn);
112116 }
113117
114118 static void step_forward(struct page_vma_mapped_walk *pvmw, unsigned long size)
....@@ -162,8 +166,7 @@
162166 return not_found(pvmw);
163167
164168 /* when pud is not present, pte will be NULL */
165
- pvmw->pte = huge_pte_offset(mm, pvmw->address,
166
- PAGE_SIZE << compound_order(page));
169
+ pvmw->pte = huge_pte_offset(mm, pvmw->address, page_size(page));
167170 if (!pvmw->pte)
168171 return false;
169172