Changeset View
Changeset View
Standalone View
Standalone View
sys/riscv/riscv/pmap.c
Show First 20 Lines • Show All 3,492 Lines • ▼ Show 20 Lines | if (!PMAP_TRYLOCK(pmap)) { | ||||
rw_runlock(lock); | rw_runlock(lock); | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
rw_rlock(lock); | rw_rlock(lock); | ||||
if (md_gen != m->md.pv_gen) { | if (md_gen != m->md.pv_gen) { | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
goto restart; | goto restart; | ||||
} | } | ||||
} | } | ||||
l3 = pmap_l3(pmap, pv->pv_va); | l2 = pmap_l2(pmap, pv->pv_va); | ||||
KASSERT((pmap_load(l2) & PTE_RWX) == 0, | |||||
("%s: found a 2mpage in page %p's pv list", __func__, m)); | |||||
l3 = pmap_l2_to_l3(l2, pv->pv_va); | |||||
if ((pmap_load(l3) & PTE_SW_WIRED) != 0) | if ((pmap_load(l3) & PTE_SW_WIRED) != 0) | ||||
count++; | count++; | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
} | } | ||||
if ((m->flags & PG_FICTITIOUS) == 0) { | if ((m->flags & PG_FICTITIOUS) == 0) { | ||||
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); | pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); | ||||
TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) { | TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) { | ||||
pmap = PV_PMAP(pv); | pmap = PV_PMAP(pv); | ||||
▲ Show 20 Lines • Show All 230 Lines • ▼ Show 20 Lines | if (!PMAP_TRYLOCK(pmap)) { | ||||
rw_runlock(lock); | rw_runlock(lock); | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
rw_rlock(lock); | rw_rlock(lock); | ||||
if (md_gen != m->md.pv_gen) { | if (md_gen != m->md.pv_gen) { | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
goto restart; | goto restart; | ||||
} | } | ||||
} | } | ||||
l3 = pmap_l3(pmap, pv->pv_va); | l2 = pmap_l2(pmap, pv->pv_va); | ||||
KASSERT((pmap_load(l2) & PTE_RWX) == 0, | |||||
("%s: found a 2mpage in page %p's pv list", __func__, m)); | |||||
l3 = pmap_l2_to_l3(l2, pv->pv_va); | |||||
rv = (pmap_load(l3) & mask) == mask; | rv = (pmap_load(l3) & mask) == mask; | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
if (rv) | if (rv) | ||||
goto out; | goto out; | ||||
} | } | ||||
if ((m->flags & PG_FICTITIOUS) == 0) { | if ((m->flags & PG_FICTITIOUS) == 0) { | ||||
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); | pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); | ||||
TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) { | TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) { | ||||
▲ Show 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | if (!PMAP_TRYLOCK(pmap)) { | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
rw_wlock(lock); | rw_wlock(lock); | ||||
if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) { | if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) { | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
rw_wunlock(lock); | rw_wunlock(lock); | ||||
goto retry_pv_loop; | goto retry_pv_loop; | ||||
} | } | ||||
} | } | ||||
l3 = pmap_l3(pmap, pv->pv_va); | l2 = pmap_l2(pmap, pv->pv_va); | ||||
KASSERT((pmap_load(l2) & PTE_RWX) == 0, | |||||
("%s: found a 2mpage in page %p's pv list", __func__, m)); | |||||
l3 = pmap_l2_to_l3(l2, pv->pv_va); | |||||
oldl3 = pmap_load(l3); | oldl3 = pmap_load(l3); | ||||
retry: | retry: | ||||
if ((oldl3 & PTE_W) != 0) { | if ((oldl3 & PTE_W) != 0) { | ||||
newl3 = oldl3 & ~(PTE_D | PTE_W); | newl3 = oldl3 & ~(PTE_D | PTE_W); | ||||
if (!atomic_fcmpset_long(l3, &oldl3, newl3)) | if (!atomic_fcmpset_long(l3, &oldl3, newl3)) | ||||
goto retry; | goto retry; | ||||
if ((oldl3 & PTE_D) != 0) | if ((oldl3 & PTE_D) != 0) | ||||
vm_page_dirty(m); | vm_page_dirty(m); | ||||
▲ Show 20 Lines • Show All 254 Lines • ▼ Show 20 Lines | if (!PMAP_TRYLOCK(pmap)) { | ||||
rw_wlock(lock); | rw_wlock(lock); | ||||
if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) { | if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) { | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
goto restart; | goto restart; | ||||
} | } | ||||
} | } | ||||
l2 = pmap_l2(pmap, pv->pv_va); | l2 = pmap_l2(pmap, pv->pv_va); | ||||
KASSERT((pmap_load(l2) & PTE_RWX) == 0, | KASSERT((pmap_load(l2) & PTE_RWX) == 0, | ||||
("pmap_clear_modify: found a 2mpage in page %p's pv list", | ("%s: found a 2mpage in page %p's pv list", __func__, m)); | ||||
m)); | |||||
l3 = pmap_l2_to_l3(l2, pv->pv_va); | l3 = pmap_l2_to_l3(l2, pv->pv_va); | ||||
if ((pmap_load(l3) & (PTE_D | PTE_W)) == (PTE_D | PTE_W)) { | if ((pmap_load(l3) & (PTE_D | PTE_W)) == (PTE_D | PTE_W)) { | ||||
pmap_clear_bits(l3, PTE_D | PTE_W); | pmap_clear_bits(l3, PTE_D | PTE_W); | ||||
pmap_invalidate_page(pmap, pv->pv_va); | pmap_invalidate_page(pmap, pv->pv_va); | ||||
} | } | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
} | } | ||||
rw_wunlock(lock); | rw_wunlock(lock); | ||||
▲ Show 20 Lines • Show All 459 Lines • Show Last 20 Lines |