summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_pageout.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_pageout.c')
-rw-r--r--sys/vm/vm_pageout.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index d3b883d..5f8cd32 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -65,7 +65,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_pageout.c,v 1.29 1995/01/09 16:05:53 davidg Exp $
+ * $Id: vm_pageout.c,v 1.30 1995/01/10 07:32:49 davidg Exp $
*/
/*
@@ -341,7 +341,7 @@ vm_pageout_object_deactivate_pages(map, object, count, map_remove_only)
if (object->shadow->ref_count == 1)
dcount += vm_pageout_object_deactivate_pages(map, object->shadow, count / 2 + 1, map_remove_only);
else
- dcount += vm_pageout_object_deactivate_pages(map, object->shadow, count / 2 + 1, 1);
+ vm_pageout_object_deactivate_pages(map, object->shadow, count, 1);
}
if (object->paging_in_progress || !vm_object_lock_try(object))
return dcount;
@@ -518,8 +518,8 @@ vm_pageout_inactive_stats(int maxiscan)
* heuristic alert -- if a page is being re-activated,
* it probably will be used one more time...
*/
- ++m->act_count;
- ++m->act_count;
+ if (m->act_count < ACT_MAX)
+ m->act_count += ACT_ADVANCE;
}
m = next;
}
@@ -574,6 +574,7 @@ vm_pageout_scan()
*/
+rescan0:
vm_pageout_inactive_stats(MAXISCAN);
maxlaunder = (cnt.v_inactive_target > MAXLAUNDER) ?
MAXLAUNDER : cnt.v_inactive_target;
@@ -620,17 +621,21 @@ rescan1:
m->flags &= ~PG_REFERENCED;
pmap_clear_reference(VM_PAGE_TO_PHYS(m));
vm_page_activate(m);
- ++m->act_count;
- ++m->act_count;
+ if (m->act_count < ACT_MAX)
+ m->act_count += ACT_ADVANCE;
m = next;
continue;
}
vm_page_test_dirty(m);
if ((m->dirty & m->valid) == 0) {
- if (((cnt.v_free_count + cnt.v_cache_count) < desired_free) ||
- (cnt.v_cache_count < cnt.v_cache_min))
+ if (m->valid == 0) {
+ pmap_page_protect(VM_PAGE_TO_PHYS(m), VM_PROT_NONE);
+ vm_page_free(m);
+ } else if (((cnt.v_free_count + cnt.v_cache_count) < desired_free) ||
+ (cnt.v_cache_count < cnt.v_cache_min)) {
vm_page_cache(m);
+ }
} else if (maxlaunder > 0) {
int written;
@@ -684,6 +689,8 @@ rescan1:
desired_free - (cnt.v_free_count + cnt.v_cache_count);
}
}
+ if( (page_shortage <= 0) && (cnt.v_free_count < cnt.v_free_min))
+ page_shortage = 1;
}
maxscan = cnt.v_active_count;
minscan = cnt.v_active_count;
@@ -706,6 +713,8 @@ rescan1:
(m->flags & PG_BUSY) ||
(m->hold_count != 0) ||
(m->bmapped != 0)) {
+ TAILQ_REMOVE(&vm_page_queue_active, m, pageq);
+ TAILQ_INSERT_TAIL(&vm_page_queue_active, m, pageq);
m = next;
continue;
}
@@ -725,6 +734,8 @@ rescan1:
TAILQ_INSERT_TAIL(&m->object->memq, m, listq);
splx(s);
} else {
+ m->flags &= ~PG_REFERENCED;
+ pmap_clear_reference(VM_PAGE_TO_PHYS(m));
m->act_count -= min(m->act_count, ACT_DECLINE);
/*
@@ -733,10 +744,6 @@ rescan1:
if (!m->act_count && (page_shortage > 0)) {
if (m->object->ref_count == 0) {
vm_page_test_dirty(m);
-
- m->flags &= ~PG_REFERENCED;
- pmap_clear_reference(VM_PAGE_TO_PHYS(m));
-
--page_shortage;
if ((m->dirty & m->valid) == 0) {
m->act_count = 0;
@@ -745,14 +752,10 @@ rescan1:
vm_page_deactivate(m);
}
} else {
-
- m->flags &= ~PG_REFERENCED;
- pmap_clear_reference(VM_PAGE_TO_PHYS(m));
-
vm_page_deactivate(m);
--page_shortage;
}
- } else {
+ } else if (m->act_count) {
TAILQ_REMOVE(&vm_page_queue_active, m, pageq);
TAILQ_INSERT_TAIL(&vm_page_queue_active, m, pageq);
}
@@ -764,7 +767,7 @@ rescan1:
* We try to maintain some *really* free pages, this allows interrupt
* code to be guaranteed space.
*/
- while (cnt.v_free_count < MINFREE) {
+ while (cnt.v_free_count < cnt.v_free_min) {
m = vm_page_queue_cache.tqh_first;
if (!m)
break;
@@ -840,7 +843,7 @@ vm_pageout()
* free_reserved needs to include enough for the largest swap pager
* structures plus enough for any pv_entry structs when paging.
*/
- cnt.v_pageout_free_min = 5 + cnt.v_page_count / 1024;
+ cnt.v_pageout_free_min = 6 + cnt.v_page_count / 1024;
cnt.v_free_reserved = cnt.v_pageout_free_min + 2;
cnt.v_free_target = 3 * cnt.v_free_min + cnt.v_free_reserved;
cnt.v_inactive_target = cnt.v_free_count / 4;
@@ -926,8 +929,6 @@ vm_daemon()
size = p->p_vmspace->vm_pmap.pm_stats.resident_count * NBPG;
if (limit >= 0 && size >= limit) {
overage = (size - limit) / NBPG;
- if (limit == 0)
- overage += 20;
vm_pageout_map_deactivate_pages(&p->p_vmspace->vm_map,
(vm_map_entry_t) 0, &overage, vm_pageout_object_deactivate_pages);
}
OpenPOWER on IntegriCloud