| .. | .. |
|---|
| 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 | |
|---|