MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_remove_all

Function pmap_remove_all

freebsd/arm/arm/pmap-v6.c:4273–4332  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4271 */
4272
4273void
4274pmap_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 }
4300small_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);

Callers

nothing calls this directly

Calls 15

sched_pinFunction · 0.85
pa_to_pvhFunction · 0.85
pmap_pte1Function · 0.85
pmap_demote_pte1Function · 0.85
pte1_is_sectionFunction · 0.85
pte1_loadFunction · 0.85
pmap_pte2_quickFunction · 0.85
pte2_load_clearFunction · 0.85
pmap_tlb_flushFunction · 0.85
pte2_is_validFunction · 0.85
pte2_is_wiredFunction · 0.85
vm_page_aflag_setFunction · 0.85

Tested by

no test coverage detected