summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/pmap.c37
-rw-r--r--sys/i386/i386/pmap.c37
-rw-r--r--sys/vm/vm_fault.c9
-rw-r--r--sys/vm/vm_page.c5
-rw-r--r--sys/vm/vm_page.h3
5 files changed, 34 insertions, 57 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 27a5236..c96196d 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;
{
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 27a5236..c96196d 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/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;
{
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index ee4d920..d76fcc5 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -66,7 +66,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_fault.c,v 1.47 1996/05/31 00:37:56 dyson Exp $
+ * $Id: vm_fault.c,v 1.48 1996/06/01 20:50:57 dyson Exp $
*/
/*
@@ -283,16 +283,15 @@ RetryFault:;
/*
* Mark page busy for other processes, and the pagedaemon.
*/
- m->flags |= PG_BUSY;
if ((m->queue == PQ_CACHE) &&
- (cnt.v_free_count + cnt.v_cache_count) < cnt.v_free_reserved) {
+ (cnt.v_free_count + cnt.v_cache_count) < cnt.v_free_min) {
UNLOCK_AND_DEALLOCATE;
VM_WAIT;
- PAGE_WAKEUP(m);
goto RetryFault;
}
- vm_page_unqueue(m);
+ m->flags |= PG_BUSY;
+ vm_page_unqueue_nowakeup(m);
if (m->valid &&
((m->valid & VM_PAGE_BITS_ALL) != VM_PAGE_BITS_ALL) &&
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 8b607cc..47543fe 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)vm_page.c 7.4 (Berkeley) 5/7/91
- * $Id: vm_page.c,v 1.53 1996/05/31 00:38:03 dyson Exp $
+ * $Id: vm_page.c,v 1.54 1996/06/05 03:31:48 dyson Exp $
*/
/*
@@ -141,7 +141,6 @@ static inline __pure int
vm_page_hash __P((vm_object_t object, vm_pindex_t pindex))
__pure2;
-static void vm_page_unqueue_nowakeup __P((vm_page_t m));
static int vm_page_freechk_and_unqueue __P((vm_page_t m));
static void vm_page_free_wakeup __P((void));
@@ -526,7 +525,7 @@ vm_page_rename(m, new_object, new_pindex)
/*
* vm_page_unqueue without any wakeup
*/
-static __inline void
+__inline void
vm_page_unqueue_nowakeup(m)
vm_page_t m;
{
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index e11d02b..b274316 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_page.h,v 1.26 1996/05/18 04:00:18 dyson Exp $
+ * $Id: vm_page.h,v 1.27 1996/06/05 03:31:49 dyson Exp $
*/
/*
@@ -251,6 +251,7 @@ vm_offset_t vm_page_startup __P((vm_offset_t, vm_offset_t, vm_offset_t));
void vm_page_unwire __P((vm_page_t));
void vm_page_wire __P((vm_page_t));
void vm_page_unqueue __P((vm_page_t));
+void vm_page_unqueue_nowakeup __P((vm_page_t));
void vm_page_set_validclean __P((vm_page_t, int, int));
void vm_page_set_invalid __P((vm_page_t, int, int));
static __inline boolean_t vm_page_zero_fill __P((vm_page_t));
OpenPOWER on IntegriCloud