Changeset View
Changeset View
Standalone View
Standalone View
head/sys/riscv/riscv/pmap.c
Show First 20 Lines • Show All 1,147 Lines • ▼ Show 20 Lines | if (m->pindex < NUPDE) { | ||||
l1 = pmap_l1(pmap, va); | l1 = pmap_l1(pmap, va); | ||||
phys = PTE_TO_PHYS(pmap_load(l1)); | phys = PTE_TO_PHYS(pmap_load(l1)); | ||||
pdpg = PHYS_TO_VM_PAGE(phys); | pdpg = PHYS_TO_VM_PAGE(phys); | ||||
pmap_unwire_l3(pmap, va, pdpg, free); | pmap_unwire_l3(pmap, va, pdpg, free); | ||||
} | } | ||||
pmap_invalidate_page(pmap, va); | pmap_invalidate_page(pmap, va); | ||||
/* | atomic_subtract_int(&vm_cnt.v_wire_count, 1); | ||||
* This is a release store so that the ordinary store unmapping | |||||
* the page table page is globally performed before TLB shoot- | |||||
* down is begun. | |||||
*/ | |||||
atomic_subtract_rel_int(&vm_cnt.v_wire_count, 1); | |||||
/* | /* | ||||
* Put page on a list so that it is released after | * Put page on a list so that it is released after | ||||
* *ALL* TLB shootdown is done | * *ALL* TLB shootdown is done | ||||
*/ | */ | ||||
pmap_add_delayed_free_list(m, free, TRUE); | pmap_add_delayed_free_list(m, free, TRUE); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 127 Lines • ▼ Show 20 Lines | if (ptepindex >= NUPDE) { | ||||
pd_entry_t *l1, *l2; | pd_entry_t *l1, *l2; | ||||
l1index = ptepindex >> (L1_SHIFT - L2_SHIFT); | l1index = ptepindex >> (L1_SHIFT - L2_SHIFT); | ||||
l1 = &pmap->pm_l1[l1index]; | l1 = &pmap->pm_l1[l1index]; | ||||
if (pmap_load(l1) == 0) { | if (pmap_load(l1) == 0) { | ||||
/* recurse for allocating page dir */ | /* recurse for allocating page dir */ | ||||
if (_pmap_alloc_l3(pmap, NUPDE + l1index, | if (_pmap_alloc_l3(pmap, NUPDE + l1index, | ||||
lockp) == NULL) { | lockp) == NULL) { | ||||
--m->wire_count; | vm_page_unwire_noq(m); | ||||
atomic_subtract_int(&vm_cnt.v_wire_count, 1); | |||||
vm_page_free_zero(m); | vm_page_free_zero(m); | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
} else { | } else { | ||||
phys = PTE_TO_PHYS(pmap_load(l1)); | phys = PTE_TO_PHYS(pmap_load(l1)); | ||||
pdpg = PHYS_TO_VM_PAGE(phys); | pdpg = PHYS_TO_VM_PAGE(phys); | ||||
pdpg->wire_count++; | pdpg->wire_count++; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
vm_page_t m; | vm_page_t m; | ||||
KASSERT(pmap->pm_stats.resident_count == 0, | KASSERT(pmap->pm_stats.resident_count == 0, | ||||
("pmap_release: pmap resident count %ld != 0", | ("pmap_release: pmap resident count %ld != 0", | ||||
pmap->pm_stats.resident_count)); | pmap->pm_stats.resident_count)); | ||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_l1)); | m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_l1)); | ||||
m->wire_count--; | vm_page_unwire_noq(m); | ||||
atomic_subtract_int(&vm_cnt.v_wire_count, 1); | |||||
vm_page_free_zero(m); | vm_page_free_zero(m); | ||||
/* Remove pmap from the allpmaps list */ | /* Remove pmap from the allpmaps list */ | ||||
LIST_REMOVE(pmap, pm_list); | LIST_REMOVE(pmap, pm_list); | ||||
/* Remove kernel pagetables */ | /* Remove kernel pagetables */ | ||||
bzero(pmap->pm_l1, PAGE_SIZE); | bzero(pmap->pm_l1, PAGE_SIZE); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,884 Lines • Show Last 20 Lines |