summaryrefslogtreecommitdiffstats
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.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 45852fd..73906dd 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.15 1995/01/10 09:19:46 davidg Exp $
+ * $Id: vm_page.c,v 1.16 1995/01/15 07:31:34 davidg Exp $
*/
/*
@@ -601,16 +601,22 @@ vm_page_requeue(vm_page_t mem, int flags)
* Allocate and return a memory cell associated
* with this VM object/offset pair.
*
+ * page_req -- 0 normal process request VM_ALLOC_NORMAL
+ * page_req -- 1 interrupt time request VM_ALLOC_INTERRUPT
+ * page_req -- 2 system *really* needs a page VM_ALLOC_SYSTEM
+ * but *cannot* be at interrupt time
+ *
* Object must be locked.
*/
vm_page_t
-vm_page_alloc(object, offset, inttime)
+vm_page_alloc(object, offset, page_req)
vm_object_t object;
vm_offset_t offset;
- int inttime;
+ int page_req;
{
register vm_page_t mem;
int s;
+ int msgflg;
simple_lock(&vm_page_queue_free_lock);
@@ -625,22 +631,20 @@ vm_page_alloc(object, offset, inttime)
splx(s);
return (NULL);
}
- if (inttime) {
+ if (page_req == VM_ALLOC_INTERRUPT) {
if ((mem = vm_page_queue_free.tqh_first) == 0) {
- for (mem = vm_page_queue_cache.tqh_first; mem; mem = mem->pageq.tqe_next) {
- if ((mem->object->flags & OBJ_ILOCKED) == 0) {
- TAILQ_REMOVE(&vm_page_queue_cache, mem, pageq);
- vm_page_remove(mem);
- cnt.v_cache_count--;
- goto gotpage;
- }
- }
simple_unlock(&vm_page_queue_free_lock);
splx(s);
+ /*
+ * need to wakeup at interrupt time -- it doesn't do VM_WAIT
+ */
+ wakeup((caddr_t) &vm_pages_needed);
return NULL;
}
+ if( cnt.v_free_count < cnt.v_pageout_free_min)
+ wakeup((caddr_t) &vm_pages_needed);
} else {
- if ((cnt.v_free_count < 3) ||
+ if ((cnt.v_free_count < cnt.v_pageout_free_min) ||
(mem = vm_page_queue_free.tqh_first) == 0) {
mem = vm_page_queue_cache.tqh_first;
if (mem) {
@@ -649,9 +653,15 @@ vm_page_alloc(object, offset, inttime)
cnt.v_cache_count--;
goto gotpage;
}
- simple_unlock(&vm_page_queue_free_lock);
- splx(s);
- return (NULL);
+ if( page_req == VM_ALLOC_SYSTEM) {
+ mem = vm_page_queue_free.tqh_first;
+ if( !mem) {
+ simple_unlock(&vm_page_queue_free_lock);
+ splx(s);
+ wakeup((caddr_t) &vm_pages_needed);
+ return (NULL);
+ }
+ }
}
}
@@ -661,7 +671,7 @@ vm_page_alloc(object, offset, inttime)
gotpage:
simple_unlock(&vm_page_queue_free_lock);
- mem->flags = PG_BUSY | PG_CLEAN;
+ mem->flags = PG_BUSY;
mem->wire_count = 0;
mem->hold_count = 0;
mem->act_count = 0;
@@ -680,7 +690,8 @@ gotpage:
* we would be nearly out of memory.
*/
if (curproc != pageproc &&
- ((cnt.v_free_count + cnt.v_cache_count) < cnt.v_free_min))
+ ((cnt.v_free_count + cnt.v_cache_count) < cnt.v_free_min) ||
+ (cnt.v_free_count < cnt.v_pageout_free_min))
wakeup((caddr_t) &vm_pages_needed);
return (mem);
@@ -1109,8 +1120,8 @@ void
vm_page_test_dirty(m)
vm_page_t m;
{
- if ((!m->dirty || (m->dirty != vm_page_bits(0, PAGE_SIZE))) &&
- pmap_is_modified(VM_PAGE_TO_PHYS(m))) {
+ if ((m->dirty != VM_PAGE_BITS_ALL) &&
+ pmap_is_modified(VM_PAGE_TO_PHYS(m))) {
pmap_clear_modify(VM_PAGE_TO_PHYS(m));
m->dirty = VM_PAGE_BITS_ALL;
}
OpenPOWER on IntegriCloud