| 4271 | */ |
| 4272 | |
| 4273 | void |
| 4274 | pmap_remove_all(vm_page_t m) |
| 4275 | { |
| 4276 | struct md_page *pvh; |
| 4277 | pv_entry_t pv; |
| 4278 | pmap_t pmap; |
| 4279 | pt2_entry_t *pte2p, opte2; |
| 4280 | pt1_entry_t *pte1p; |
| 4281 | vm_offset_t va; |
| 4282 | struct spglist free; |
| 4283 | |
| 4284 | KASSERT((m->oflags & VPO_UNMANAGED) == 0, |
| 4285 | ("%s: page %p is not managed", __func__, m)); |
| 4286 | SLIST_INIT(&free); |
| 4287 | rw_wlock(&pvh_global_lock); |
| 4288 | sched_pin(); |
| 4289 | if ((m->flags & PG_FICTITIOUS) != 0) |
| 4290 | goto small_mappings; |
| 4291 | pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); |
| 4292 | while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) { |
| 4293 | va = pv->pv_va; |
| 4294 | pmap = PV_PMAP(pv); |
| 4295 | PMAP_LOCK(pmap); |
| 4296 | pte1p = pmap_pte1(pmap, va); |
| 4297 | (void)pmap_demote_pte1(pmap, pte1p, va); |
| 4298 | PMAP_UNLOCK(pmap); |
| 4299 | } |
| 4300 | small_mappings: |
| 4301 | while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { |
| 4302 | pmap = PV_PMAP(pv); |
| 4303 | PMAP_LOCK(pmap); |
| 4304 | pmap->pm_stats.resident_count--; |
| 4305 | pte1p = pmap_pte1(pmap, pv->pv_va); |
| 4306 | KASSERT(!pte1_is_section(pte1_load(pte1p)), ("%s: found " |
| 4307 | "a 1mpage in page %p's pv list", __func__, m)); |
| 4308 | pte2p = pmap_pte2_quick(pmap, pv->pv_va); |
| 4309 | opte2 = pte2_load_clear(pte2p); |
| 4310 | pmap_tlb_flush(pmap, pv->pv_va); |
| 4311 | KASSERT(pte2_is_valid(opte2), ("%s: pmap %p va %x zero pte2", |
| 4312 | __func__, pmap, pv->pv_va)); |
| 4313 | if (pte2_is_wired(opte2)) |
| 4314 | pmap->pm_stats.wired_count--; |
| 4315 | if (opte2 & PTE2_A) |
| 4316 | vm_page_aflag_set(m, PGA_REFERENCED); |
| 4317 | |
| 4318 | /* |
| 4319 | * Update the vm_page_t clean and reference bits. |
| 4320 | */ |
| 4321 | if (pte2_is_dirty(opte2)) |
| 4322 | vm_page_dirty(m); |
| 4323 | pmap_unuse_pt2(pmap, pv->pv_va, &free); |
| 4324 | TAILQ_REMOVE(&m->md.pv_list, pv, pv_next); |
| 4325 | free_pv_entry(pmap, pv); |
| 4326 | PMAP_UNLOCK(pmap); |
| 4327 | } |
| 4328 | vm_page_aflag_clear(m, PGA_WRITEABLE); |
| 4329 | sched_unpin(); |
| 4330 | rw_wunlock(&pvh_global_lock); |
nothing calls this directly
no test coverage detected