summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_object.c')
-rw-r--r--sys/vm/vm_object.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 8b8e606..57b66ec 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id$
+ * $Id: vm_object.c,v 1.3 1994/08/02 07:55:29 davidg Exp $
*/
/*
@@ -353,7 +353,7 @@ vm_object_terminate(object)
VM_PAGE_CHECK(p);
vm_page_lock_queues();
- s = splimp();
+ s = splhigh();
if (p->flags & PG_ACTIVE) {
TAILQ_REMOVE(&vm_page_queue_active, p, pageq);
p->flags &= ~PG_ACTIVE;
@@ -613,7 +613,6 @@ again:
vm_page_deactivate(p);
vm_page_unlock_queues();
}
- p->flags &= ~PG_BUSY;
PAGE_WAKEUP(p);
goto again;
}
@@ -713,6 +712,7 @@ vm_object_pmap_remove(object, start, end)
register vm_offset_t end;
{
register vm_page_t p;
+ int s;
if (object == NULL)
return;
@@ -721,11 +721,14 @@ vm_object_pmap_remove(object, start, end)
again:
for (p = object->memq.tqh_first; p != NULL; p = p->listq.tqe_next) {
if ((start <= p->offset) && (p->offset < end)) {
+ s = splhigh();
if (p->flags & PG_BUSY) {
p->flags |= PG_WANTED;
tsleep((caddr_t) p, PVM, "vmopmr", 0);
+ splx(s);
goto again;
}
+ splx(s);
pmap_page_protect(VM_PAGE_TO_PHYS(p), VM_PROT_NONE);
if ((p->flags & PG_CLEAN) == 0)
p->flags |= PG_LAUNDRY;
@@ -1456,11 +1459,14 @@ again:
for (p = object->memq.tqh_first; (p != NULL && size > 0); p = next) {
next = p->listq.tqe_next;
if ((start <= p->offset) && (p->offset < end)) {
+ s=splhigh();
if (p->flags & PG_BUSY) {
p->flags |= PG_WANTED;
tsleep((caddr_t) p, PVM, "vmopar", 0);
+ splx(s);
goto again;
}
+ splx(s);
pmap_page_protect(VM_PAGE_TO_PHYS(p), VM_PROT_NONE);
vm_page_lock_queues();
vm_page_free(p);
@@ -1471,11 +1477,14 @@ again:
} else {
while (size > 0) {
while (p = vm_page_lookup(object, start)) {
+ s = splhigh();
if (p->flags & PG_BUSY) {
p->flags |= PG_WANTED;
tsleep((caddr_t) p, PVM, "vmopar", 0);
+ splx(s);
goto again;
}
+ splx(s);
pmap_page_protect(VM_PAGE_TO_PHYS(p), VM_PROT_NONE);
vm_page_lock_queues();
vm_page_free(p);
OpenPOWER on IntegriCloud