| 6173 | */ |
| 6174 | |
| 6175 | void |
| 6176 | pmap_remove_all(vm_page_t m) |
| 6177 | { |
| 6178 | struct md_page *pvh; |
| 6179 | pv_entry_t pv; |
| 6180 | pmap_t pmap; |
| 6181 | struct rwlock *lock; |
| 6182 | pt_entry_t *pte, tpte, PG_A, PG_M, PG_RW; |
| 6183 | pd_entry_t *pde; |
| 6184 | vm_offset_t va; |
| 6185 | struct spglist free; |
| 6186 | int pvh_gen, md_gen; |
| 6187 | |
| 6188 | KASSERT((m->oflags & VPO_UNMANAGED) == 0, |
| 6189 | ("pmap_remove_all: page %p is not managed", m)); |
| 6190 | SLIST_INIT(&free); |
| 6191 | lock = VM_PAGE_TO_PV_LIST_LOCK(m); |
| 6192 | pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : |
| 6193 | pa_to_pvh(VM_PAGE_TO_PHYS(m)); |
| 6194 | retry: |
| 6195 | rw_wlock(lock); |
| 6196 | while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) { |
| 6197 | pmap = PV_PMAP(pv); |
| 6198 | if (!PMAP_TRYLOCK(pmap)) { |
| 6199 | pvh_gen = pvh->pv_gen; |
| 6200 | rw_wunlock(lock); |
| 6201 | PMAP_LOCK(pmap); |
| 6202 | rw_wlock(lock); |
| 6203 | if (pvh_gen != pvh->pv_gen) { |
| 6204 | rw_wunlock(lock); |
| 6205 | PMAP_UNLOCK(pmap); |
| 6206 | goto retry; |
| 6207 | } |
| 6208 | } |
| 6209 | va = pv->pv_va; |
| 6210 | pde = pmap_pde(pmap, va); |
| 6211 | (void)pmap_demote_pde_locked(pmap, pde, va, &lock); |
| 6212 | PMAP_UNLOCK(pmap); |
| 6213 | } |
| 6214 | while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { |
| 6215 | pmap = PV_PMAP(pv); |
| 6216 | if (!PMAP_TRYLOCK(pmap)) { |
| 6217 | pvh_gen = pvh->pv_gen; |
| 6218 | md_gen = m->md.pv_gen; |
| 6219 | rw_wunlock(lock); |
| 6220 | PMAP_LOCK(pmap); |
| 6221 | rw_wlock(lock); |
| 6222 | if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) { |
| 6223 | rw_wunlock(lock); |
| 6224 | PMAP_UNLOCK(pmap); |
| 6225 | goto retry; |
| 6226 | } |
| 6227 | } |
| 6228 | PG_A = pmap_accessed_bit(pmap); |
| 6229 | PG_M = pmap_modified_bit(pmap); |
| 6230 | PG_RW = pmap_rw_bit(pmap); |
| 6231 | pmap_resident_count_dec(pmap, 1); |
| 6232 | pde = pmap_pde(pmap, pv->pv_va); |
nothing calls this directly
no test coverage detected