Date: Tue, 25 Jun 1996 20:37:52 -0700 From: David Greenman <davidg@root.com> To: dyson@FreeBSD.org Cc: stable@FreeBSD.org Subject: Re: Another try at the vm_pageout.c -stable diff Message-ID: <199606260337.UAA00265@root.com> In-Reply-To: Your message of "Tue, 25 Jun 1996 22:16:10 CDT." <199606260316.WAA00184@dyson.iquest.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Here is yet another diff. This is the product of a discussion I just had
with John about the nature of some of the performance problems people have
complained about.
This makes a slight change to the policy for bringing pages off of the
active queue and should make the statistics gather *much* more effective
in some cases. Please try it out and get back to us. Thanks!
-DG
David Greenman
Core-team/Principal Architect, The FreeBSD Project
(This includes John's other changes, so apply this to a fresh -stable copy of
vm_pageout.c)
Index: vm_pageout.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_pageout.c,v
retrieving revision 1.51.4.6
diff -c -r1.51.4.6 vm_pageout.c
*** vm_pageout.c 1996/06/19 07:26:57 1.51.4.6
--- vm_pageout.c 1996/06/26 03:23:47
***************
*** 352,362 ****
* The object and map must be locked.
*/
int
! vm_pageout_object_deactivate_pages(map, object, count, map_remove_only)
vm_map_t map;
vm_object_t object;
int count;
int map_remove_only;
{
register vm_page_t p, next;
int s, rcount, dcount;
--- 352,363 ----
* The object and map must be locked.
*/
int
! vm_pageout_object_deactivate_pages(map, object, count, map_remove_only, recursion)
vm_map_t map;
vm_object_t object;
int count;
int map_remove_only;
+ int *recursion;
{
register vm_page_t p, next;
int s, rcount, dcount;
***************
*** 365,378 ****
if (count == 0)
count = 1;
if (object->pager && (object->pager->pg_type == PG_DEVICE))
return 0;
if (object->shadow) {
if (object->shadow->ref_count == 1)
! dcount += vm_pageout_object_deactivate_pages(map, object->shadow, count / 2 + 1, map_remove_only);
else
! vm_pageout_object_deactivate_pages(map, object->shadow, count, 1);
}
if (object->paging_in_progress || !vm_object_lock_try(object))
return dcount;
--- 366,383 ----
if (count == 0)
count = 1;
+ (*recursion)++;
+ if (*recursion > 5)
+ return 0;
+
if (object->pager && (object->pager->pg_type == PG_DEVICE))
return 0;
if (object->shadow) {
if (object->shadow->ref_count == 1)
! dcount += vm_pageout_object_deactivate_pages(map, object->shadow, count / 2 + 1, map_remove_only, recursion);
else
! vm_pageout_object_deactivate_pages(map, object->shadow, count, 1, recursion);
}
if (object->paging_in_progress || !vm_object_lock_try(object))
return dcount;
***************
*** 466,482 ****
*/
void
! vm_pageout_map_deactivate_pages(map, entry, count, freeer)
vm_map_t map;
vm_map_entry_t entry;
int *count;
! int (*freeer) (vm_map_t, vm_object_t, int);
{
vm_map_t tmpm;
vm_map_entry_t tmpe;
vm_object_t obj;
! if (*count <= 0)
return;
vm_map_reference(map);
if (!lock_try_read(&map->lock)) {
--- 471,488 ----
*/
void
! vm_pageout_map_deactivate_pages(map, entry, count, freeer, recursion)
vm_map_t map;
vm_map_entry_t entry;
int *count;
! int (*freeer) (vm_map_t, vm_object_t, int, int *);
! int *recursion;
{
vm_map_t tmpm;
vm_map_entry_t tmpe;
vm_object_t obj;
! if ((*recursion > 5) || (*count <= 0))
return;
vm_map_reference(map);
if (!lock_try_read(&map->lock)) {
***************
*** 486,503 ****
if (entry == 0) {
tmpe = map->header.next;
while (tmpe != &map->header && *count > 0) {
! vm_pageout_map_deactivate_pages(map, tmpe, count, freeer, 0);
tmpe = tmpe->next;
};
} else if (entry->is_sub_map || entry->is_a_map) {
tmpm = entry->object.share_map;
tmpe = tmpm->header.next;
while (tmpe != &tmpm->header && *count > 0) {
! vm_pageout_map_deactivate_pages(tmpm, tmpe, count, freeer, 0);
tmpe = tmpe->next;
};
} else if ((obj = entry->object.vm_object) != 0) {
! *count -= (*freeer) (map, obj, *count);
}
lock_read_done(&map->lock);
vm_map_deallocate(map);
--- 492,509 ----
if (entry == 0) {
tmpe = map->header.next;
while (tmpe != &map->header && *count > 0) {
! vm_pageout_map_deactivate_pages(map, tmpe, count, freeer, recursion);
tmpe = tmpe->next;
};
} else if (entry->is_sub_map || entry->is_a_map) {
tmpm = entry->object.share_map;
tmpe = tmpm->header.next;
while (tmpe != &tmpm->header && *count > 0) {
! vm_pageout_map_deactivate_pages(tmpm, tmpe, count, freeer, recursion);
tmpe = tmpe->next;
};
} else if ((obj = entry->object.vm_object) != 0) {
! *count -= (*freeer) (map, obj, *count, recursion);
}
lock_read_done(&map->lock);
vm_map_deallocate(map);
***************
*** 656,662 ****
next = m->pageq.tqe_next;
if ((m->flags & PG_ACTIVE) == 0)
! goto rescan_active;
/*
* Don't deactivate pages that are busy.
--- 662,668 ----
next = m->pageq.tqe_next;
if ((m->flags & PG_ACTIVE) == 0)
! break;
/*
* Don't deactivate pages that are busy.
***************
*** 693,711 ****
* if the page act_count is zero -- then we deactivate
*/
if (!m->act_count && (page_shortage > 0)) {
! if (m->object->ref_count == 0) {
! --page_shortage;
! vm_page_test_dirty(m);
! if ((m->bmapped == 0) && (m->dirty == 0) ) {
! m->act_count = 0;
! vm_page_cache(m);
! } else {
! vm_page_deactivate(m);
! }
! } else {
! vm_page_deactivate(m);
! --page_shortage;
! }
} else if (m->act_count) {
s = splbio();
TAILQ_REMOVE(&vm_page_queue_active, m, pageq);
--- 699,706 ----
* if the page act_count is zero -- then we deactivate
*/
if (!m->act_count && (page_shortage > 0)) {
! vm_page_deactivate(m);
! --page_shortage;
} else if (m->act_count) {
s = splbio();
TAILQ_REMOVE(&vm_page_queue_active, m, pageq);
***************
*** 901,907 ****
swapout_threads();
vm_pageout_req_swapout = 0;
}
- #if 0
/*
* scan the processes for exceeding their rlimits or if
* process is swapped out -- deactivate pages
--- 896,901 ----
***************
*** 909,914 ****
--- 903,909 ----
for (p = (struct proc *) allproc; p != NULL; p = p->p_next) {
int overage;
+ int recursion;
quad_t limit;
vm_offset_t size;
***************
*** 943,953 ****
size = p->p_vmspace->vm_pmap.pm_stats.resident_count * NBPG;
if (limit >= 0 && size >= limit) {
overage = (size - limit) / NBPG;
vm_pageout_map_deactivate_pages(&p->p_vmspace->vm_map,
! (vm_map_entry_t) 0, &overage, vm_pageout_object_deactivate_pages);
}
}
- #endif
}
}
#endif /* !NO_SWAPPING */
--- 938,948 ----
size = p->p_vmspace->vm_pmap.pm_stats.resident_count * NBPG;
if (limit >= 0 && size >= limit) {
overage = (size - limit) / NBPG;
+ recursion = 0;
vm_pageout_map_deactivate_pages(&p->p_vmspace->vm_map,
! (vm_map_entry_t) 0, &overage, vm_pageout_object_deactivate_pages, &recursion);
}
}
}
}
#endif /* !NO_SWAPPING */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199606260337.UAA00265>
