From owner-p4-projects@FreeBSD.ORG Wed Aug 27 19:51:33 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BB0FA1065674; Wed, 27 Aug 2008 19:51:33 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6607F106564A for ; Wed, 27 Aug 2008 19:51:33 +0000 (UTC) (envelope-from mayur@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 5B9E08FC18 for ; Wed, 27 Aug 2008 19:51:33 +0000 (UTC) (envelope-from mayur@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m7RJpXij039692 for ; Wed, 27 Aug 2008 19:51:33 GMT (envelope-from mayur@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m7RJpXKJ039690 for perforce@freebsd.org; Wed, 27 Aug 2008 19:51:33 GMT (envelope-from mayur@FreeBSD.org) Date: Wed, 27 Aug 2008 19:51:33 GMT Message-Id: <200808271951.m7RJpXKJ039690@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mayur@FreeBSD.org using -f From: Mayur Shardul To: Perforce Change Reviews Cc: Subject: PERFORCE change 148645 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Aug 2008 19:51:34 -0000 http://perforce.freebsd.org/chv.cgi?CH=148645 Change 148645 by mayur@mayur_freebsd_vm on 2008/08/27 19:51:04 Bug fixes and cleanup. Affected files ... .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/default_pager.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/device_pager.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/memguard.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/memguard.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/phys_pager.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/pmap.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/radix_tree.c#3 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/radix_tree.h#3 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/redzone.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/redzone.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/swap_pager.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/swap_pager.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_core.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_dbg.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_dbg.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_int.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_contig.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_extern.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_fault.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_glue.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_init.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_kern.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_kern.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_map.c#3 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_map.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_meter.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_mmap.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.c#4 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.h#4 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_page.c#4 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_page.h#3 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pageout.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pageout.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pager.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pager.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_param.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_phys.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_phys.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_reserv.c#4 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_reserv.h#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_unix.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_zeroidle.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vnode_pager.c#2 edit .. //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vnode_pager.h#2 edit Differences ... ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/default_pager.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/device_pager.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/memguard.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/memguard.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/phys_pager.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/pmap.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/radix_tree.c#3 (text+ko) ==== @@ -253,6 +253,9 @@ rtidx_t slot; struct radix_node *tmp; + if(index > MASK(rtree->rt_height * rtree->rt_bits_per_level)){ + return NULL; + } level = rtree->rt_height - 1; tmp = rtree->rt_root; while (tmp){ @@ -278,6 +281,9 @@ SLIST_HEAD(, radix_node) rtree_path = SLIST_HEAD_INITIALIZER(rtree_path); + if(index > MASK(rtree->rt_height * rtree->rt_bits_per_level)) + return NULL; + level = rtree->rt_height - 1; tmp = rtree->rt_root; while (tmp){ @@ -294,9 +300,9 @@ */ tmp = SLIST_FIRST(&rtree_path); SLIST_REMOVE_HEAD(&rtree_path, next); - while (level != 0) + while (1) { - while(slot <= MASK(rtree->rt_bits_per_level) + while (slot <= MASK(rtree->rt_bits_per_level) && tmp->rn_children[slot] == NULL) slot++; if(slot > MASK(rtree->rt_bits_per_level)){ @@ -316,7 +322,6 @@ slot = 0; level--; } - return tmp; } level--; } @@ -336,6 +341,9 @@ SLIST_HEAD(, radix_node) rtree_path = SLIST_HEAD_INITIALIZER(rtree_path); + if(index > MASK(rtree->rt_height * rtree->rt_bits_per_level)) + index = MASK(rtree->rt_height * rtree->rt_bits_per_level); + level = rtree->rt_height - 1; tmp = rtree->rt_root; while (tmp){ @@ -352,11 +360,13 @@ */ tmp = SLIST_FIRST(&rtree_path); SLIST_REMOVE_HEAD(&rtree_path, next); - while (level != 0) - { - while(slot >= 0 - && tmp->rn_children[slot] == NULL) + while (1){ + while (slot > 0 + && tmp->rn_children[slot] == NULL) + slot--; + if(tmp->rn_children[slot] == NULL){ slot--; + } if(slot > MASK(rtree->rt_bits_per_level)){ if(level == rtree->rt_height - 1) return NULL; @@ -366,15 +376,13 @@ slot = get_slot(index,rtree,level) - 1; continue; } - if(level == 0){ + if(level == 0) return tmp->rn_children[slot]; - } SLIST_INSERT_HEAD(&rtree_path, tmp, next); tmp = tmp->rn_children[slot]; slot = MASK(rtree->rt_bits_per_level); level--; } - return tmp; } level--; } ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/radix_tree.h#3 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/redzone.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/redzone.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/swap_pager.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/swap_pager.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_core.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_dbg.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_dbg.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/uma_int.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_contig.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_extern.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_fault.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_glue.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_init.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_kern.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_kern.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_map.c#3 (text+ko) ==== @@ -1501,14 +1501,19 @@ start = 0; p_start = NULL; + /* if ((p = TAILQ_FIRST(&object->memq)) != NULL) { if (p->pindex < pindex) { - p = vm_page_lookup_geidx(pindex, object); - //p = vm_page_splay(pindex, object->root); - //if ((object->root = p)->pindex < pindex) - // p = TAILQ_NEXT(p, listq); + + p = vm_page_splay(pindex, object->root); + if ((object->root = p)->pindex < pindex) + p = TAILQ_NEXT(p, listq); + + r = radix_tree_lookup_ge(pindex, &object->rtree); + KASSERT(r == p, ("r != p, lookup_ge failed\n")); } - } + }*/ + p = radix_tree_lookup_ge(pindex, &object->rtree); /* * Assert: the variable p is either (1) the page with the * least pindex greater than or equal to the parameter pindex ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_map.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_meter.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_mmap.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.c#4 (text+ko) ==== @@ -216,12 +216,13 @@ TAILQ_INIT(&object->memq); LIST_INIT(&object->shadow_head); + //object->root = NULL; object->rtree.rt_bits_per_level = 4; object->rtree.rt_height = 0; object->rtree.rt_root = NULL; object->rtree.rt_max_height = (8*sizeof(rtidx_t))/4; object->rtree.rt_max_index = ~((rtidx_t)0); - //object->root = NULL; + object->type = type; object->size = size; object->generation = 1; @@ -696,10 +697,6 @@ #endif if (__predict_false(object->cache != NULL)) vm_page_cache_free(object, 0, 0); - radix_tree_shrink(&object->rtree); - if(object->rtree.rt_root != NULL) - panic("VM_ALGO: rt_root != NULL\n"); - /* * Let the pager know object is dead. @@ -1365,10 +1362,17 @@ retry: if ((m = TAILQ_FIRST(&orig_object->memq)) != NULL) { if (m->pindex < offidxstart) { - m = vm_page_lookup_geidx(offidxstart, orig_object); - //m = vm_page_splay(offidxstart, orig_object->root); - //if ((orig_object->root = m)->pindex < offidxstart) - // m = TAILQ_NEXT(m, listq); + /* + m = vm_page_splay(offidxstart, orig_object->root); + if ((orig_object->root = m)->pindex < offidxstart) + m = TAILQ_NEXT(m, listq); + */ + m = radix_tree_lookup_ge(offidxstart, + &orig_object->rtree); + /* + KASSERT( r == m, ("VM_ALGO: vm_object_split " + "lookup_ge failed")); + */ } } vm_page_lock_queues(); @@ -1888,10 +1892,16 @@ vm_page_lock_queues(); if ((p = TAILQ_FIRST(&object->memq)) != NULL) { if (p->pindex < start) { - p = vm_page_lookup_geidx(start,object); - //p = vm_page_splay(start, object->root); - //if ((object->root = p)->pindex < start) - // p = TAILQ_NEXT(p, listq); + /* + p = vm_page_splay(start, object->root); + if ((object->root = p)->pindex < start) + p = TAILQ_NEXT(p, listq); + */ + p = radix_tree_lookup_ge(start, &object->rtree); + /* + KASSERT(r == p, ("VM_ALGO: vm_object_page_remove " + "lookup_ge failed\n")); + */ } } /* ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_object.h#4 (text+ko) ==== @@ -90,7 +90,7 @@ LIST_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ TAILQ_HEAD(, vm_page) memq; /* list of resident pages */ //vm_page_t root; /* root of the resident page splay tree */ - struct radix_tree rtree; /* root of the resident page radix tree */ + struct radix_tree rtree; vm_pindex_t size; /* Object size */ int generation; /* generation ID */ int ref_count; /* How many refs?? */ ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_page.c#4 (text+ko) ==== @@ -289,7 +289,6 @@ next); mapped += rnode_size; } - /* * Allocate memory for use when boot strapping the kernel memory * allocator. @@ -350,6 +349,9 @@ mapped = pmap_map(&vaddr, new_end, end, VM_PROT_READ | VM_PROT_WRITE); vm_page_array = (vm_page_t) mapped; + + + #if VM_NRESERVLEVEL > 0 /* * Allocate memory for the reservation management system's data @@ -655,7 +657,7 @@ void vm_page_insert(vm_page_t m, vm_object_t object, vm_pindex_t pindex) { - //vm_page_t root; + vm_page_t neighbour; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); if (m->object != NULL) @@ -692,9 +694,26 @@ TAILQ_INSERT_AFTER(&object->memq, root, m, listq); } } - object->root = m;*/ + object->root = m; + */ + if(object->resident_page_count == 0){ + TAILQ_INSERT_TAIL(&object->memq, m, listq); + } + else{ + if((neighbour = radix_tree_lookup_ge(pindex, + &object->rtree)) != NULL){ + KASSERT( pindex != neighbour->pindex, ("vm_page_insert" + ": offset already allocated")); + TAILQ_INSERT_BEFORE(neighbour, m, listq); + }else{ + neighbour = radix_tree_lookup_le(pindex, + &object->rtree); + TAILQ_INSERT_AFTER(&object->memq, neighbour, m, listq); + } + } + object->generation++; - radix_tree_insert(pindex,&object->rtree,m); + radix_tree_insert(pindex, &object->rtree, m); /* * show that the object has one more resident page. @@ -753,9 +772,8 @@ root = vm_page_splay(m->pindex, m->left); root->right = m->right; } - object->root = root;*/ - - radix_tree_remove(m->pindex,&object->rtree); + object->root = root; + */ TAILQ_REMOVE(&object->memq, m, listq); /* @@ -763,6 +781,7 @@ */ object->resident_page_count--; object->generation++; + radix_tree_remove(m->pindex,&object->rtree); /* * The vnode may now be recycled. */ @@ -785,19 +804,18 @@ vm_page_t vm_page_lookup(vm_object_t object, vm_pindex_t pindex) { - vm_page_t m; + + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); /* - VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); if ((m = object->root) != NULL && m->pindex != pindex) { m = vm_page_splay(pindex, m); if ((object->root = m)->pindex != pindex) m = NULL; } */ - m = radix_tree_lookup(pindex,&object->rtree); - //if(r != m && m != NULL && m->pindex == pindex) - // panic("VM_ALGO: vm_page_lookup r != m\n"); + m = radix_tree_lookup(pindex, &object->rtree); + //KASSERT( r == m, ("VM_ALGO: r != m, lookup failed.")); return (m); } @@ -1678,10 +1696,10 @@ } object->root = root; */ + radix_tree_remove(m->pindex, &object->rtree); TAILQ_REMOVE(&object->memq, m, listq); object->resident_page_count--; object->generation++; - radix_tree_remove(m->pindex,&object->rtree); /* * Insert the page into the object's collection of cached pages @@ -2144,33 +2162,6 @@ pmap_remove_write(m); } -/* - * vm_page_lookup_geidx: - * returns index which is grater than or equal to given index from the tree. - * - */ - -vm_page_t -vm_page_lookup_geidx(vm_pindex_t index, vm_object_t object) -{ - vm_pindex_t i = 0; - vm_page_t p; - - do{ - p = (vm_page_t) radix_tree_lookup(index - i, - &object->rtree); - i++; - }while (i <= index); - if(i > index) - return NULL; - if(p != NULL){ - if(i == 0) - return p; - return TAILQ_NEXT(p, listq); - } - return p; -} - #include "opt_ddb.h" #ifdef DDB #include ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_page.h#3 (text+ko) ==== @@ -325,7 +325,6 @@ void vm_page_deactivate (vm_page_t); void vm_page_insert (vm_page_t, vm_object_t, vm_pindex_t); vm_page_t vm_page_lookup (vm_object_t, vm_pindex_t); -vm_page_t vm_page_lookup_geidx (vm_pindex_t , vm_object_t); void vm_page_remove (vm_page_t); void vm_page_rename (vm_page_t, vm_object_t, vm_pindex_t); void vm_page_requeue(vm_page_t m); ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pageout.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pageout.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pager.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_pager.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_param.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_phys.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_phys.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_reserv.c#4 (text+ko) ==== @@ -311,51 +311,16 @@ /* * Look for an existing reservation. */ - msucc = NULL; + //msucc = NULL; //mpred = object->root; - mpred = radix_tree_lookup_le(pindex, &object->rtree); - if(mpred != NULL && mpred->object == object){ - KASSERT(mpred->pindex != pindex, - ("vm_reserv_alloc_page: pindex already allocated")); - rv = vm_reserv_from_page(mpred); - KASSERT( rv != NULL, ("vm_reserv_alloc_page: null rv")); - if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) { - m = &rv->pages[VM_RESERV_INDEX(object, pindex)]; - //Handle vm_page_rename(m, new_object, ...). - if ((m->flags & (PG_CACHED | PG_FREE)) == 0) - return (NULL); - vm_reserv_populate(rv); - return (m); - } - }else{ - mpred = NULL; - } - - msucc = radix_tree_lookup_ge(pindex, &object->rtree); - if(msucc != NULL && msucc->object == object){ - KASSERT(msucc->pindex != pindex, - ("vm_reserv_alloc_page: pindex already allocated")); - rv = vm_reserv_from_page(msucc); - KASSERT( rv != NULL, ("vm_reserv_alloc_page: null rv")); - if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) { - m = &rv->pages[VM_RESERV_INDEX(object, pindex)]; - //Handle vm_page_rename(m, new_object, ...). - if ((m->flags & (PG_CACHED | PG_FREE)) == 0) - return (NULL); - vm_reserv_populate(rv); - return (m); - } - }else{ - msucc = NULL; - } /* - while (mpred != NULL) { + while (mpred != NULL) { KASSERT(mpred->pindex != pindex, ("vm_reserv_alloc_page: pindex already allocated")); rv = vm_reserv_from_page(mpred); if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) { m = &rv->pages[VM_RESERV_INDEX(object, pindex)]; - Handle vm_page_rename(m, new_object, ...). + // Handle vm_page_rename(m, new_object, ...). if ((m->flags & (PG_CACHED | PG_FREE)) == 0) return (NULL); vm_reserv_populate(rv); @@ -370,7 +335,7 @@ if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) { m = &rv->pages[VM_RESERV_INDEX(object, pindex)]; - Handle vm_page_rename(m, new_object, ...). + // Handle vm_page_rename(m, new_object, ...). if ((m->flags & (PG_CACHED | PG_FREE)) == 0) return (NULL); vm_reserv_populate(rv); @@ -386,7 +351,37 @@ mpred = object->root = vm_page_splay(pindex, object->root); } */ + mpred = radix_tree_lookup_le(pindex, &object->rtree); + if(mpred != NULL){ + KASSERT(mpred->pindex != pindex, + ("vm_reserv_alloc_page: pindex already allocated")); + rv = vm_reserv_from_page(mpred); + if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) { + m = &rv->pages[VM_RESERV_INDEX(object, pindex)]; + // Handle vm_page_rename(m, new_object, ...). + if ((m->flags & (PG_CACHED | PG_FREE)) == 0) + return (NULL); + vm_reserv_populate(rv); + return (m); + } + } + msucc = radix_tree_lookup_ge(pindex, &object->rtree); + if(msucc != NULL){ + KASSERT(msucc->pindex != pindex, + ("vm_reserv_alloc_page: pindex already allocated")); + rv = vm_reserv_from_page(msucc); + if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) { + m = &rv->pages[VM_RESERV_INDEX(object, pindex)]; + // Handle vm_page_rename(m, new_object, ...). + if ((m->flags & (PG_CACHED | PG_FREE)) == 0) + return (NULL); + vm_reserv_populate(rv); + return (m); + } + } + //KASSERT(rpred == mpred, ("rpred != mpred\n")); + //KASSERT(msucc == rsucc, ("msucc != rsucc\n")); /* * Determine the first index to the left that can be used. */ ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_reserv.h#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_unix.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vm_zeroidle.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vnode_pager.c#2 (text+ko) ==== ==== //depot/projects/soc2008/mayur_vmalgo/kern/src/sys/vm/vnode_pager.h#2 (text+ko) ====