PERFORCE change 148645 for review
Mayur Shardul
mayur at FreeBSD.org
Wed Aug 27 19:51:34 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=148645
Change 148645 by mayur at 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 <sys/kernel.h>
==== //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) ====
More information about the p4-projects
mailing list