PERFORCE change 85836 for review

Alan Cox alc at FreeBSD.org
Tue Oct 25 10:49:04 PDT 2005


http://perforce.freebsd.org/chv.cgi?CH=85836

Change 85836 by alc at alc_home on 2005/10/25 17:48:31

	Make reserve_lookup() responsible for the creation of a reservation
	if an existing one is not found.

Affected files ...

.. //depot/projects/superpages/src/sys/vm/vm_page.c#8 edit
.. //depot/projects/superpages/src/sys/vm/vm_reserve.c#7 edit
.. //depot/projects/superpages/src/sys/vm/vm_reserve.h#2 edit

Differences ...

==== //depot/projects/superpages/src/sys/vm/vm_page.c#8 (text+ko) ====

@@ -782,7 +782,7 @@
 {
 	reservation_t top;
 	vm_page_t m = NULL;
-	int flags, level, page_req;
+	int flags, page_req;
 
 	page_req = req & VM_ALLOC_CLASS_MASK;
 	KASSERT(curthread->td_intr_nesting_level == 0 ||
@@ -793,16 +793,7 @@
 		KASSERT(object != NULL,
 		    ("vm_page_alloc: NULL object."));
 		VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-		top = reserve_lookup(&level, object, pindex);
-		if (top == NULL && level > -1) {
-			m = preempt_contig_alloc(&level, TRUE);
-			if (m != NULL) {
-				top = new_reserve(level, object);
-				top->first_page = m;
-				top->first_pindex = pindex - SP_POS(object,
-				    pindex, level);
-			}
-		}
+		top = reserve_lookup(object, pindex);
 	} else
 		top = NULL;
 

==== //depot/projects/superpages/src/sys/vm/vm_reserve.c#7 (text+ko) ====

@@ -55,8 +55,10 @@
 
 #define NO_RESQ		SP_LEVELS		/*reserv->rql==NO_RESQ -> reservation is in no reservation queue */
 
+static vm_page_t preempt_contig_alloc(int *level, int free_pool);
 static void preempt_move(reservation_t sp, boolean_t to_tail);
 
+static reservation_t new_reserve(int level, vm_object_t object);
 static void reserve_procreate(reservation_t, vm_page_t);
 
 static uma_zone_t sp_zone;
@@ -151,18 +153,16 @@
 
 /* Look for an existing reservation for the given virtual address */
 reservation_t
-reserve_lookup(int *level /*OUT*/, vm_object_t object, 
-		vm_pindex_t pindex)
+reserve_lookup(vm_object_t object, vm_pindex_t pindex)
 {
-	int l;
-	vm_page_t p, s = NULL;		/* predecessor, successor */
+	int l, level;
+	reservation_t res;
+	vm_page_t m, p, s = NULL;		/* predecessor, successor */
 	vm_pindex_t first, leftcap, rightcap;
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-	if ((object->flags & OBJ_SUPERPAGES) == 0 || pindex >= object->size) {
-		*level = -1;
+	if ((object->flags & OBJ_SUPERPAGES) == 0 || pindex >= object->size)
 		return (NULL);
-	}
 	if ((p = TAILQ_FIRST(&object->memq)) != NULL) {
 		if (p->pindex < pindex)
 			p = object->root = vm_page_splay(pindex, object->root);
@@ -204,7 +204,17 @@
 	}
 	l--;
 	KASSERT(l >= -1 && l < SP_LEVELS, ("reserve_lookup: level not valid"));
-	*level = policy(object, pindex, l);
+	level = policy(object, pindex, l);
+	if (level > -1) {
+		m = preempt_contig_alloc(&level, TRUE);
+		if (m != NULL) {
+			res = new_reserve(level, object);
+			res->first_page = m;
+			res->first_pindex = pindex - SP_POS(object, pindex,
+			    level);
+			return (res);
+		}
+	}
 	return NULL;
 }
 
@@ -223,7 +233,7 @@
 	return (res);
 }
 
-reservation_t 
+static reservation_t 
 new_reserve(int level, vm_object_t object)
 {
 	reservation_t sp = uma_zalloc(sp_zone, M_NOWAIT | M_ZERO);
@@ -498,7 +508,7 @@
  * The free_pool parameter is a boolean value indicating
  * if we try to allocate from the free pool or not
  */
-vm_page_t
+static vm_page_t
 preempt_contig_alloc(int *level, int free_pool)
 {
 	int l, lev = level ? *level : -1;

==== //depot/projects/superpages/src/sys/vm/vm_reserve.h#2 (text+ko) ====

@@ -72,12 +72,10 @@
 	reservation_t child[SP_FACTOR];
 };
 
-reservation_t new_reserve(int level, vm_object_t object);
 reservation_t reserve_lazy_update(vm_page_t m);
-reservation_t reserve_lookup(int *, vm_object_t, vm_pindex_t);
+reservation_t reserve_lookup(vm_object_t, vm_pindex_t);
 void reserve_populate(vm_page_t, reservation_t);
 void reserve_unpopulate(vm_page_t);
 
-vm_page_t preempt_contig_alloc(int *level, int free_pool);
 void preempt_init(void) ;
 void preempt_destroy(vm_page_t m);


More information about the p4-projects mailing list