Fix an error in statement order in pmap_remove_pages, remove the pmap

pte hint (for now), and general code cleanup.
This commit is contained in:
John Dyson 1996-07-29 03:08:51 +00:00
parent 4c1b70728d
commit b7fb357273
2 changed files with 20 additions and 78 deletions

View File

@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* $Id: pmap.c,v 1.110 1996/07/27 03:23:22 dyson Exp $
* $Id: pmap.c,v 1.111 1996/07/28 20:31:27 dyson Exp $
*/
/*
@ -672,7 +672,6 @@ retry:
VM_PAGE_TO_PHYS(ptdpg) | PG_V | PG_RW;
pmap->pm_count = 1;
pmap->pm_ptphint = NULL;
TAILQ_INIT(&pmap->pm_pvlist.pv_list);
}
@ -715,9 +714,6 @@ pmap_release_free_page(pmap, p)
pmap_kremove((vm_offset_t) pmap->pm_pdir);
}
if (pmap->pm_ptphint == p)
pmap->pm_ptphint = NULL;
vm_page_free_zero(p);
splx(s);
return 1;
@ -811,13 +807,7 @@ pmap_allocpte(pmap, va)
* hold count, and activate it.
*/
if (ptepa) {
if (pmap->pm_ptphint &&
(pmap->pm_ptphint->pindex == ptepindex)) {
m = pmap->pm_ptphint;
} else {
m = vm_page_lookup( pmap->pm_pteobj, ptepindex);
pmap->pm_ptphint = m;
}
m = vm_page_lookup( pmap->pm_pteobj, ptepindex);
++m->hold_count;
return m;
}
@ -1104,8 +1094,6 @@ pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m) {
*/
--m->wire_count;
if (m->wire_count == 0) {
if (pmap->pm_ptphint == m)
pmap->pm_ptphint = NULL;
vm_page_free_zero(m);
--cnt.v_wire_count;
}
@ -1130,13 +1118,7 @@ pmap_unuse_pt(pmap, va, mpte)
if (mpte == NULL) {
ptepindex = (va >> PDRSHIFT);
if (pmap->pm_ptphint &&
pmap->pm_ptphint->pindex == ptepindex) {
mpte = pmap->pm_ptphint;
} else {
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
pmap->pm_ptphint = mpte;
}
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
}
return pmap_unwire_pte_hold(pmap, mpte);
@ -1704,13 +1686,7 @@ pmap_enter_quick(pmap, va, pa, mpte)
* the hold count, and activate it.
*/
if (ptepa) {
if (pmap->pm_ptphint &&
pmap->pm_ptphint->pindex == ptepindex) {
mpte = pmap->pm_ptphint;
} else {
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
pmap->pm_ptphint = mpte;
}
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
++mpte->hold_count;
} else {
mpte = _pmap_allocpte(pmap, ptepindex);
@ -2185,7 +2161,7 @@ pmap_remove_pages(pmap, sva, eva)
int s;
#ifdef PMAP_REMOVE_PAGES_CURPROC_ONLY
if (pmap != &curproc->p_vmspace->vm_pmap) {
if (!curproc || (pmap != &curproc->p_vmspace->vm_pmap)) {
printf("warning: pmap_remove_pages called with non-current pmap\n");
return;
}
@ -2210,8 +2186,6 @@ pmap_remove_pages(pmap, sva, eva)
tpte = *pte;
*pte = 0;
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist.pv_list, pv, pv_plist);
if (tpte) {
pv->pv_pmap->pm_stats.resident_count--;
if (tpte & PG_W)
@ -2225,10 +2199,11 @@ pmap_remove_pages(pmap, sva, eva)
}
npv = TAILQ_NEXT(pv, pv_plist);
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist.pv_list, pv, pv_plist);
ppv = pa_to_pvh(tpte);
TAILQ_REMOVE(&ppv->pv_list, pv, pv_list);
--ppv->pv_list_count;
TAILQ_REMOVE(&ppv->pv_list, pv, pv_list);
pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
free_pv_entry(pv);
@ -2284,16 +2259,12 @@ pmap_tcbit(vm_offset_t pa, int bit)
if ((rtval == 0) && (*pte & bit)) {
rtval = 1;
*pte &= ~bit;
} else {
*pte &= ~bit;
}
*pte &= ~bit;
}
splx(s);
if (rtval) {
if (curproc != pageproc)
pmap_update();
}
if (rtval)
pmap_update();
return (rtval);
}

View File

@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* $Id: pmap.c,v 1.110 1996/07/27 03:23:22 dyson Exp $
* $Id: pmap.c,v 1.111 1996/07/28 20:31:27 dyson Exp $
*/
/*
@ -672,7 +672,6 @@ retry:
VM_PAGE_TO_PHYS(ptdpg) | PG_V | PG_RW;
pmap->pm_count = 1;
pmap->pm_ptphint = NULL;
TAILQ_INIT(&pmap->pm_pvlist.pv_list);
}
@ -715,9 +714,6 @@ pmap_release_free_page(pmap, p)
pmap_kremove((vm_offset_t) pmap->pm_pdir);
}
if (pmap->pm_ptphint == p)
pmap->pm_ptphint = NULL;
vm_page_free_zero(p);
splx(s);
return 1;
@ -811,13 +807,7 @@ pmap_allocpte(pmap, va)
* hold count, and activate it.
*/
if (ptepa) {
if (pmap->pm_ptphint &&
(pmap->pm_ptphint->pindex == ptepindex)) {
m = pmap->pm_ptphint;
} else {
m = vm_page_lookup( pmap->pm_pteobj, ptepindex);
pmap->pm_ptphint = m;
}
m = vm_page_lookup( pmap->pm_pteobj, ptepindex);
++m->hold_count;
return m;
}
@ -1104,8 +1094,6 @@ pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m) {
*/
--m->wire_count;
if (m->wire_count == 0) {
if (pmap->pm_ptphint == m)
pmap->pm_ptphint = NULL;
vm_page_free_zero(m);
--cnt.v_wire_count;
}
@ -1130,13 +1118,7 @@ pmap_unuse_pt(pmap, va, mpte)
if (mpte == NULL) {
ptepindex = (va >> PDRSHIFT);
if (pmap->pm_ptphint &&
pmap->pm_ptphint->pindex == ptepindex) {
mpte = pmap->pm_ptphint;
} else {
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
pmap->pm_ptphint = mpte;
}
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
}
return pmap_unwire_pte_hold(pmap, mpte);
@ -1704,13 +1686,7 @@ pmap_enter_quick(pmap, va, pa, mpte)
* the hold count, and activate it.
*/
if (ptepa) {
if (pmap->pm_ptphint &&
pmap->pm_ptphint->pindex == ptepindex) {
mpte = pmap->pm_ptphint;
} else {
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
pmap->pm_ptphint = mpte;
}
mpte = vm_page_lookup( pmap->pm_pteobj, ptepindex);
++mpte->hold_count;
} else {
mpte = _pmap_allocpte(pmap, ptepindex);
@ -2185,7 +2161,7 @@ pmap_remove_pages(pmap, sva, eva)
int s;
#ifdef PMAP_REMOVE_PAGES_CURPROC_ONLY
if (pmap != &curproc->p_vmspace->vm_pmap) {
if (!curproc || (pmap != &curproc->p_vmspace->vm_pmap)) {
printf("warning: pmap_remove_pages called with non-current pmap\n");
return;
}
@ -2210,8 +2186,6 @@ pmap_remove_pages(pmap, sva, eva)
tpte = *pte;
*pte = 0;
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist.pv_list, pv, pv_plist);
if (tpte) {
pv->pv_pmap->pm_stats.resident_count--;
if (tpte & PG_W)
@ -2225,10 +2199,11 @@ pmap_remove_pages(pmap, sva, eva)
}
npv = TAILQ_NEXT(pv, pv_plist);
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist.pv_list, pv, pv_plist);
ppv = pa_to_pvh(tpte);
TAILQ_REMOVE(&ppv->pv_list, pv, pv_list);
--ppv->pv_list_count;
TAILQ_REMOVE(&ppv->pv_list, pv, pv_list);
pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
free_pv_entry(pv);
@ -2284,16 +2259,12 @@ pmap_tcbit(vm_offset_t pa, int bit)
if ((rtval == 0) && (*pte & bit)) {
rtval = 1;
*pte &= ~bit;
} else {
*pte &= ~bit;
}
*pte &= ~bit;
}
splx(s);
if (rtval) {
if (curproc != pageproc)
pmap_update();
}
if (rtval)
pmap_update();
return (rtval);
}