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

Function pmap_remove_all

freebsd/amd64/amd64/pmap.c:6175–6258  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6173 */
6174
6175void
6176pmap_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));
6194retry:
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);

Callers

nothing calls this directly

Calls 15

pa_to_pvhFunction · 0.85
pmap_demote_pde_lockedFunction · 0.85
pmap_accessed_bitFunction · 0.85
pmap_modified_bitFunction · 0.85
pmap_rw_bitFunction · 0.85
vm_page_aflag_setFunction · 0.85
vm_page_dirtyFunction · 0.85
vm_page_aflag_clearFunction · 0.85
vm_page_free_pages_toqFunction · 0.85
pmap_pdeFunction · 0.70
pmap_resident_count_decFunction · 0.70
pmap_pde_to_pteFunction · 0.70

Tested by

no test coverage detected