Date: Tue, 25 Jun 1996 22:16:10 -0500 (EST) From: "John S. Dyson" <toor@dyson.iquest.net> To: stable@freebsd.org Subject: Another try at the vm_pageout.c -stable diff Message-ID: <199606260316.WAA00184@dyson.iquest.net>
next in thread | raw e-mail | index | archive | help
I have been having real problems today, and here is a context diff
against stable vm_pageout.c. I really thought that I had produced
a context diff, so this is the real one. If the previous patch applied
cleanly for you, cool -- don't bother applying this one also!!! :-).
Thanks for being very patient today!!! Time for stress meds...
John
Index: vm_pageout.c
===================================================================
RCS file: /local/home/ncvs/src/sys/vm/vm_pageout.c,v
retrieving revision 1.51.4.6
diff -C2 -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 00:48:33
***************
*** 353,361 ****
*/
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;
--- 353,362 ----
*/
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;
***************
*** 366,369 ****
--- 367,374 ----
count = 1;
+ (*recursion)++;
+ if (*recursion > 5)
+ return 0;
+
if (object->pager && (object->pager->pg_type == PG_DEVICE))
return 0;
***************
*** 371,377 ****
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))
--- 376,382 ----
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))
***************
*** 467,475 ****
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;
--- 472,481 ----
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;
***************
*** 477,481 ****
vm_object_t obj;
! if (*count <= 0)
return;
vm_map_reference(map);
--- 483,487 ----
vm_object_t obj;
! if ((*recursion > 5) || (*count <= 0))
return;
vm_map_reference(map);
***************
*** 487,491 ****
tmpe = map->header.next;
while (tmpe != &map->header && *count > 0) {
! vm_pageout_map_deactivate_pages(map, tmpe, count, freeer, 0);
tmpe = tmpe->next;
};
--- 493,497 ----
tmpe = map->header.next;
while (tmpe != &map->header && *count > 0) {
! vm_pageout_map_deactivate_pages(map, tmpe, count, freeer, recursion);
tmpe = tmpe->next;
};
***************
*** 494,502 ****
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);
--- 500,508 ----
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);
***************
*** 656,661 ****
--- 662,671 ----
next = m->pageq.tqe_next;
+ /* XXX I think that this will decrease perf
if ((m->flags & PG_ACTIVE) == 0)
goto rescan_active;
+ */
+ if ((m->flags & PG_ACTIVE) == 0)
+ break;
/*
***************
*** 902,906 ****
vm_pageout_req_swapout = 0;
}
- #if 0
/*
* scan the processes for exceeding their rlimits or if
--- 912,915 ----
***************
*** 910,913 ****
--- 919,923 ----
for (p = (struct proc *) allproc; p != NULL; p = p->p_next) {
int overage;
+ int recursion;
quad_t limit;
vm_offset_t size;
***************
*** 944,952 ****
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
}
}
--- 954,962 ----
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);
}
}
}
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199606260316.WAA00184>
