Lines Matching refs:pvmw
10 static inline bool not_found(struct page_vma_mapped_walk *pvmw) in not_found() argument
12 page_vma_mapped_walk_done(pvmw); in not_found()
16 static bool map_pte(struct page_vma_mapped_walk *pvmw) in map_pte() argument
18 pvmw->pte = pte_offset_map(pvmw->pmd, pvmw->address); in map_pte()
19 if (!(pvmw->flags & PVMW_SYNC)) { in map_pte()
20 if (pvmw->flags & PVMW_MIGRATION) { in map_pte()
21 if (!is_swap_pte(*pvmw->pte)) in map_pte()
24 if (!pte_present(*pvmw->pte)) in map_pte()
28 pvmw->ptl = pte_lockptr(pvmw->vma->vm_mm, pvmw->pmd); in map_pte()
29 spin_lock(pvmw->ptl); in map_pte()
59 static bool check_pte(struct page_vma_mapped_walk *pvmw) in check_pte() argument
63 if (pvmw->flags & PVMW_MIGRATION) { in check_pte()
65 if (!is_swap_pte(*pvmw->pte)) in check_pte()
67 entry = pte_to_swp_entry(*pvmw->pte); in check_pte()
73 } else if (is_swap_pte(*pvmw->pte)) { in check_pte()
77 entry = pte_to_swp_entry(*pvmw->pte); in check_pte()
83 if (!pte_present(*pvmw->pte)) in check_pte()
86 pfn = pte_pfn(*pvmw->pte); in check_pte()
89 return pfn_in_hpage(pvmw->page, pfn); in check_pte()
116 bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw) in page_vma_mapped_walk() argument
118 struct mm_struct *mm = pvmw->vma->vm_mm; in page_vma_mapped_walk()
119 struct page *page = pvmw->page; in page_vma_mapped_walk()
126 if (pvmw->pmd && !pvmw->pte) in page_vma_mapped_walk()
127 return not_found(pvmw); in page_vma_mapped_walk()
129 if (pvmw->pte) in page_vma_mapped_walk()
132 if (unlikely(PageHuge(pvmw->page))) { in page_vma_mapped_walk()
134 pvmw->pte = huge_pte_offset(mm, pvmw->address, in page_vma_mapped_walk()
136 if (!pvmw->pte) in page_vma_mapped_walk()
139 pvmw->ptl = huge_pte_lockptr(page_hstate(page), mm, pvmw->pte); in page_vma_mapped_walk()
140 spin_lock(pvmw->ptl); in page_vma_mapped_walk()
141 if (!check_pte(pvmw)) in page_vma_mapped_walk()
142 return not_found(pvmw); in page_vma_mapped_walk()
146 pgd = pgd_offset(mm, pvmw->address); in page_vma_mapped_walk()
149 p4d = p4d_offset(pgd, pvmw->address); in page_vma_mapped_walk()
152 pud = pud_offset(p4d, pvmw->address); in page_vma_mapped_walk()
155 pvmw->pmd = pmd_offset(pud, pvmw->address); in page_vma_mapped_walk()
161 pmde = READ_ONCE(*pvmw->pmd); in page_vma_mapped_walk()
163 pvmw->ptl = pmd_lock(mm, pvmw->pmd); in page_vma_mapped_walk()
164 if (likely(pmd_trans_huge(*pvmw->pmd))) { in page_vma_mapped_walk()
165 if (pvmw->flags & PVMW_MIGRATION) in page_vma_mapped_walk()
166 return not_found(pvmw); in page_vma_mapped_walk()
167 if (pmd_page(*pvmw->pmd) != page) in page_vma_mapped_walk()
168 return not_found(pvmw); in page_vma_mapped_walk()
170 } else if (!pmd_present(*pvmw->pmd)) { in page_vma_mapped_walk()
172 if (!(pvmw->flags & PVMW_MIGRATION)) in page_vma_mapped_walk()
173 return not_found(pvmw); in page_vma_mapped_walk()
174 if (is_migration_entry(pmd_to_swp_entry(*pvmw->pmd))) { in page_vma_mapped_walk()
175 swp_entry_t entry = pmd_to_swp_entry(*pvmw->pmd); in page_vma_mapped_walk()
178 return not_found(pvmw); in page_vma_mapped_walk()
182 return not_found(pvmw); in page_vma_mapped_walk()
185 spin_unlock(pvmw->ptl); in page_vma_mapped_walk()
186 pvmw->ptl = NULL; in page_vma_mapped_walk()
191 if (!map_pte(pvmw)) in page_vma_mapped_walk()
194 if (check_pte(pvmw)) in page_vma_mapped_walk()
198 if (!PageTransHuge(pvmw->page) || PageHuge(pvmw->page)) in page_vma_mapped_walk()
199 return not_found(pvmw); in page_vma_mapped_walk()
201 pvmw->address += PAGE_SIZE; in page_vma_mapped_walk()
202 if (pvmw->address >= pvmw->vma->vm_end || in page_vma_mapped_walk()
203 pvmw->address >= in page_vma_mapped_walk()
204 __vma_address(pvmw->page, pvmw->vma) + in page_vma_mapped_walk()
205 hpage_nr_pages(pvmw->page) * PAGE_SIZE) in page_vma_mapped_walk()
206 return not_found(pvmw); in page_vma_mapped_walk()
208 if (pvmw->address % PMD_SIZE == 0) { in page_vma_mapped_walk()
209 pte_unmap(pvmw->pte); in page_vma_mapped_walk()
210 if (pvmw->ptl) { in page_vma_mapped_walk()
211 spin_unlock(pvmw->ptl); in page_vma_mapped_walk()
212 pvmw->ptl = NULL; in page_vma_mapped_walk()
216 pvmw->pte++; in page_vma_mapped_walk()
218 } while (pte_none(*pvmw->pte)); in page_vma_mapped_walk()
220 if (!pvmw->ptl) { in page_vma_mapped_walk()
221 pvmw->ptl = pte_lockptr(mm, pvmw->pmd); in page_vma_mapped_walk()
222 spin_lock(pvmw->ptl); in page_vma_mapped_walk()
238 struct page_vma_mapped_walk pvmw = { in page_mapped_in_vma() local
250 pvmw.address = max(start, vma->vm_start); in page_mapped_in_vma()
251 if (!page_vma_mapped_walk(&pvmw)) in page_mapped_in_vma()
253 page_vma_mapped_walk_done(&pvmw); in page_mapped_in_vma()