.. | .. |
---|
52 | 52 | return true; |
---|
53 | 53 | } |
---|
54 | 54 | |
---|
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) |
---|
56 | 56 | { |
---|
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; |
---|
58 | 62 | |
---|
59 | 63 | /* 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); |
---|
61 | 65 | } |
---|
62 | 66 | |
---|
63 | 67 | /** |
---|
.. | .. |
---|
108 | 112 | pfn = pte_pfn(*pvmw->pte); |
---|
109 | 113 | } |
---|
110 | 114 | |
---|
111 | | - return pfn_in_hpage(pvmw->page, pfn); |
---|
| 115 | + return pfn_is_match(pvmw->page, pfn); |
---|
112 | 116 | } |
---|
113 | 117 | |
---|
114 | 118 | static void step_forward(struct page_vma_mapped_walk *pvmw, unsigned long size) |
---|
.. | .. |
---|
162 | 166 | return not_found(pvmw); |
---|
163 | 167 | |
---|
164 | 168 | /* 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)); |
---|
167 | 170 | if (!pvmw->pte) |
---|
168 | 171 | return false; |
---|
169 | 172 | |
---|