From owner-freebsd-stable Tue Jun 25 20:38:10 1996 Return-Path: owner-stable Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id UAA00979 for stable-outgoing; Tue, 25 Jun 1996 20:38:10 -0700 (PDT) Received: from root.com (implode.root.com [198.145.90.17]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id UAA00966; Tue, 25 Jun 1996 20:37:57 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by root.com (8.7.5/8.6.5) with SMTP id UAA00265; Tue, 25 Jun 1996 20:37:52 -0700 (PDT) Message-Id: <199606260337.UAA00265@root.com> X-Authentication-Warning: implode.root.com: Host localhost [127.0.0.1] didn't use HELO protocol To: dyson@FreeBSD.org cc: stable@FreeBSD.org Subject: Re: Another try at the vm_pageout.c -stable diff In-reply-to: Your message of "Tue, 25 Jun 1996 22:16:10 CDT." <199606260316.WAA00184@dyson.iquest.net> From: David Greenman Reply-To: davidg@root.com Date: Tue, 25 Jun 1996 20:37:52 -0700 Sender: owner-stable@FreeBSD.org X-Loop: FreeBSD.org Precedence: bulk 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 */