From owner-freebsd-stable Tue Jun 25 20:23:02 1996 Return-Path: owner-stable Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id UAA29775 for stable-outgoing; Tue, 25 Jun 1996 20:23:02 -0700 (PDT) Received: from dyson.iquest.net (dyson.iquest.net [198.70.144.127]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id UAA29769 for ; Tue, 25 Jun 1996 20:22:56 -0700 (PDT) Received: (from root@localhost) by dyson.iquest.net (8.7.5/8.6.9) id WAA00184 for stable@freebsd.org; Tue, 25 Jun 1996 22:16:10 -0500 (EST) From: "John S. Dyson" Message-Id: <199606260316.WAA00184@dyson.iquest.net> Subject: Another try at the vm_pageout.c -stable diff To: stable@freebsd.org Date: Tue, 25 Jun 1996 22:16:10 -0500 (EST) Reply-To: dyson@freebsd.org X-Mailer: ELM [version 2.4 PL24 ME8] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-stable@freebsd.org X-Loop: FreeBSD.org Precedence: bulk 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); } } } }