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