aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64/amd64/pmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/amd64/amd64/pmap.c')
-rw-r--r--sys/amd64/amd64/pmap.c37
1 files changed, 13 insertions, 24 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 27a523618691..c96196da63bc 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.100 1996/06/05 06:36:21 dyson Exp $
+ * $Id: pmap.c,v 1.101 1996/06/07 02:36:08 dyson Exp $
*/
/*
@@ -730,17 +730,6 @@ pmap_release(pmap)
if (object->ref_count != 1)
panic("pmap_release: pteobj reference count != 1");
- /*
- * Wait until any (bogus) paging activity on this object is
- * complete.
- */
- s = splvm();
- while (object->paging_in_progress) {
- object->flags |= OBJ_PIPWNT;
- tsleep(object,PVM,"pmrlob",0);
- }
- splx(s);
-
ptdpg = NULL;
retry:
for (p = TAILQ_FIRST(&object->memq); p != NULL; p = n) {
@@ -749,15 +738,14 @@ retry:
ptdpg = p;
continue;
}
- if ((p->flags & PG_BUSY) || p->busy)
- continue;
if (!pmap_release_free_page(pmap, p))
goto retry;
}
if (ptdpg == NULL)
panic("pmap_release: missing page table directory page");
- pmap_release_free_page(pmap, ptdpg);
+ if (!pmap_release_free_page(pmap, ptdpg))
+ goto retry;
vm_object_deallocate(object);
if (pdstackptr < PDSTACKMAX) {
@@ -1173,7 +1161,11 @@ pmap_remove(pmap, sva, eva)
}
}
-
+/*
+ * Remove pte mapping, don't do everything that we would do
+ * for normal pages because many things aren't necessary (like
+ * pmap_update())...
+ */
void
pmap_remove_pte_mapping(pa)
vm_offset_t pa;
@@ -1189,7 +1181,6 @@ pmap_remove_pte_mapping(pa)
unsigned tpte;
struct pmap *pmap;
- anyvalid = 1;
pmap = pv->pv_pmap;
pte = get_ptbase(pmap) + i386_btop(pv->pv_va);
if (tpte = *pte) {
@@ -1200,13 +1191,11 @@ pmap_remove_pte_mapping(pa)
}
}
- if (anyvalid) {
- for (pv = *ppv; pv; pv = npv) {
- npv = pv->pv_next;
- free_pv_entry(pv);
- }
- *ppv = NULL;
+ for (pv = *ppv; pv; pv = npv) {
+ npv = pv->pv_next;
+ free_pv_entry(pv);
}
+ *ppv = NULL;
}
/*
@@ -1221,7 +1210,7 @@ pmap_remove_pte_mapping(pa)
* inefficient because they iteratively called
* pmap_remove (slow...)
*/
-static __inline void
+static void
pmap_remove_all(pa)
vm_offset_t pa;
{