Skip site navigation (1)Skip section navigation (2)
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>