summaryrefslogtreecommitdiff
path: root/sys/vm/vm_page.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_page.c')
-rw-r--r--sys/vm/vm_page.c93
1 files changed, 54 insertions, 39 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 31a99382a7d6..409438163be6 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.12 1994/02/09 07:03:10 davidg Exp $
+ * $Id: vm_page.c,v 1.18 1994/06/17 13:29:13 davidg Exp $
*/
/*
@@ -311,6 +311,7 @@ vm_page_startup(starta, enda, vaddr)
m->flags = 0;
m->object = 0;
m->phys_addr = pa;
+ m->hold_count = 0;
queue_enter(&vm_page_queue_free, m, vm_page_t, pageq);
pa += PAGE_SIZE;
}
@@ -469,7 +470,7 @@ vm_page_lookup(object, offset)
*/
bucket = &vm_page_buckets[vm_page_hash(object, offset)];
- spl = vm_disable_intr();
+ spl = splimp();
simple_lock(&bucket_lock);
mem = (vm_page_t) queue_first(bucket);
@@ -477,14 +478,14 @@ vm_page_lookup(object, offset)
VM_PAGE_CHECK(mem);
if ((mem->object == object) && (mem->offset == offset)) {
simple_unlock(&bucket_lock);
- vm_set_intr(spl);
+ splx(spl);
return(mem);
}
mem = (vm_page_t) queue_next(&mem->hashq);
}
simple_unlock(&bucket_lock);
- vm_set_intr(spl);
+ splx(spl);
return(NULL);
}
@@ -508,10 +509,10 @@ vm_page_rename(mem, new_object, new_offset)
vm_page_lock_queues(); /* keep page from moving out from
under pageout daemon */
- spl = vm_disable_intr();
+ spl = splimp();
vm_page_remove(mem);
vm_page_insert(mem, new_object, new_offset);
- vm_set_intr(spl);
+ splx(spl);
vm_page_unlock_queues();
}
@@ -531,7 +532,7 @@ vm_page_alloc(object, offset)
register vm_page_t mem;
int spl;
- spl = vm_disable_intr();
+ spl = splimp();
simple_lock(&vm_page_queue_free_lock);
if ( object != kernel_object &&
object != kmem_object &&
@@ -539,7 +540,7 @@ vm_page_alloc(object, offset)
vm_page_free_count < vm_page_free_reserved) {
simple_unlock(&vm_page_queue_free_lock);
- vm_set_intr(spl);
+ splx(spl);
/*
* this wakeup seems unnecessary, but there is code that
* might just check to see if there are free pages, and
@@ -552,7 +553,7 @@ vm_page_alloc(object, offset)
}
if (queue_empty(&vm_page_queue_free)) {
simple_unlock(&vm_page_queue_free_lock);
- vm_set_intr(spl);
+ splx(spl);
/*
* comment above re: wakeups applies here too...
*/
@@ -569,8 +570,9 @@ vm_page_alloc(object, offset)
mem->flags = PG_BUSY|PG_CLEAN|PG_FAKE;
vm_page_insert(mem, object, offset);
mem->wire_count = 0;
- mem->deact = 0;
- vm_set_intr(spl);
+ mem->hold_count = 0;
+ mem->act_count = 0;
+ splx(spl);
/*
* don't wakeup too often, so we wakeup the pageout daemon when
@@ -597,10 +599,9 @@ vm_page_free(mem)
{
int spl;
- spl = vm_disable_intr();
+ spl = splimp();
vm_page_remove(mem);
- mem->deact = 0;
if (mem->flags & PG_ACTIVE) {
queue_remove(&vm_page_queue_active, mem, vm_page_t, pageq);
mem->flags &= ~PG_ACTIVE;
@@ -624,7 +625,7 @@ vm_page_free(mem)
vm_page_free_count++;
simple_unlock(&vm_page_queue_free_lock);
- vm_set_intr(spl);
+ splx(spl);
/*
* if pageout daemon needs pages, then tell it that there
@@ -650,7 +651,7 @@ vm_page_free(mem)
}
} else {
- vm_set_intr(spl);
+ splx(spl);
}
wakeup((caddr_t) mem);
}
@@ -670,7 +671,7 @@ vm_page_wire(mem)
{
int spl;
VM_PAGE_CHECK(mem);
- spl = vm_disable_intr();
+ spl = splimp();
if (mem->wire_count == 0) {
if (mem->flags & PG_ACTIVE) {
@@ -688,7 +689,7 @@ vm_page_wire(mem)
vm_page_wire_count++;
}
mem->wire_count++;
- vm_set_intr(spl);
+ splx(spl);
}
/*
@@ -706,7 +707,7 @@ vm_page_unwire(mem)
int spl;
VM_PAGE_CHECK(mem);
- spl = vm_disable_intr();
+ spl = splimp();
if (mem->wire_count != 0)
mem->wire_count--;
if (mem->wire_count == 0) {
@@ -714,9 +715,8 @@ vm_page_unwire(mem)
vm_page_active_count++;
mem->flags |= PG_ACTIVE;
vm_page_wire_count--;
- vm_pageout_deact_bump(mem);
}
- vm_set_intr(spl);
+ splx(spl);
}
/*
@@ -745,9 +745,8 @@ vm_page_deactivate(m)
* Paul Mackerras (paulus@cs.anu.edu.au) 9-Jan-93.
*/
- spl = splhigh();
- m->deact = 0;
- if (!(m->flags & PG_INACTIVE) && m->wire_count == 0) {
+ spl = splimp();
+ if (!(m->flags & PG_INACTIVE) && m->wire_count == 0 && m->hold_count == 0) {
pmap_clear_reference(VM_PAGE_TO_PHYS(m));
if (m->flags & PG_ACTIVE) {
queue_remove(&vm_page_queue_active, m, vm_page_t, pageq);
@@ -757,7 +756,13 @@ vm_page_deactivate(m)
queue_enter(&vm_page_queue_inactive, m, vm_page_t, pageq);
m->flags |= PG_INACTIVE;
vm_page_inactive_count++;
+#define NOT_DEACTIVATE_PROTECTS
+#ifndef NOT_DEACTIVATE_PROTECTS
pmap_page_protect(VM_PAGE_TO_PHYS(m), VM_PROT_NONE);
+#else
+ if (pmap_is_modified(VM_PAGE_TO_PHYS(m)))
+ m->flags &= ~PG_CLEAN;
+#endif
if ((m->flags & PG_CLEAN) == 0)
m->flags |= PG_LAUNDRY;
}
@@ -789,32 +794,42 @@ void
vm_page_activate(m)
register vm_page_t m;
{
- int spl;
+ int spl, target, shortage, maxscan;
+ vm_page_t actm, next;
+
VM_PAGE_CHECK(m);
- vm_pageout_deact_bump(m);
+ spl = splimp();
- spl = vm_disable_intr();
+ if (m->wire_count) {
+ splx(spl);
+ return;
+ }
+
+ if ((m->flags & (PG_INACTIVE|PG_ACTIVE)) ==
+ (PG_INACTIVE|PG_ACTIVE)) {
+ panic("vm_page_activate: on both queues?");
+ }
if (m->flags & PG_INACTIVE) {
- queue_remove(&vm_page_queue_inactive, m, vm_page_t,
- pageq);
+ queue_remove(&vm_page_queue_inactive, m, vm_page_t, pageq);
vm_page_inactive_count--;
m->flags &= ~PG_INACTIVE;
+ vm_stat.reactivations++;
}
- if (m->wire_count == 0) {
- if (m->flags & PG_ACTIVE)
- panic("vm_page_activate: already active");
-
- m->flags |= PG_ACTIVE;
- queue_enter(&vm_page_queue_active, m, vm_page_t, pageq);
- queue_remove(&m->object->memq, m, vm_page_t, listq);
- queue_enter(&m->object->memq, m, vm_page_t, listq);
- vm_page_active_count++;
- }
+ if (m->flags & PG_ACTIVE)
+ panic("vm_page_activate: already active");
+
+ m->flags |= PG_ACTIVE;
+ queue_enter(&vm_page_queue_active, m, vm_page_t, pageq);
+ queue_remove(&m->object->memq, m, vm_page_t, listq);
+ queue_enter(&m->object->memq, m, vm_page_t, listq);
+ vm_page_active_count++;
+ /* m->act_count = 10; */
+ m->act_count = 1;
- vm_set_intr(spl);
+ splx(spl);
}
/*