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