Date: Tue, 25 Oct 2005 17:49:01 GMT From: Alan Cox <alc@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 85836 for review Message-ID: <200510251749.j9PHn1R7036698@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=85836 Change 85836 by alc@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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200510251749.j9PHn1R7036698>