summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_reserv.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2011-10-30 11:11:04 +0000
committerjeff <jeff@FreeBSD.org>2011-10-30 11:11:04 +0000
commit9e2e6a2980c96185bbe81d081d64d0a32bd42961 (patch)
treee1a2a2f82a025980770697c9b5d082a9e598706c /sys/vm/vm_reserv.c
parentb29030ce37e1b81d952e6533c3a29e7176e3ec9e (diff)
downloadFreeBSD-src-9e2e6a2980c96185bbe81d081d64d0a32bd42961.zip
FreeBSD-src-9e2e6a2980c96185bbe81d081d64d0a32bd42961.tar.gz
- Support two types of nodes, red and black, within the same radix tree.
Black nodes support standard active pages and red nodes support cached pages. Red nodes may be removed without the object lock but will not collapse unused tree nodes. Red nodes may not be directly inserted, instead a new function is supplied to convert between black and red. - Handle cached pages and active pages in the same loop in vm_object_split, vm_object_backing_scan, and vm_object_terminate. - Retire the splay page handling as the ifdefs are too difficult to maintain. - Slightly optimize the vm_radix_lookupn() function.
Diffstat (limited to 'sys/vm/vm_reserv.c')
-rw-r--r--sys/vm/vm_reserv.c46
1 files changed, 2 insertions, 44 deletions
diff --git a/sys/vm/vm_reserv.c b/sys/vm/vm_reserv.c
index 376f643..8d7b0d4 100644
--- a/sys/vm/vm_reserv.c
+++ b/sys/vm/vm_reserv.c
@@ -309,8 +309,7 @@ vm_reserv_alloc_page(vm_object_t object, vm_pindex_t pindex)
/*
* Look for an existing reservation.
*/
-#ifdef VM_RADIX
- mpred = vm_radix_lookup_le(&object->rtree, pindex);
+ mpred = vm_radix_lookup_le(&object->rtree, pindex, VM_RADIX_BLACK);
if (mpred != NULL) {
KASSERT(mpred->pindex != pindex,
("vm_reserv_alloc_page: pindex already allocated"));
@@ -323,7 +322,7 @@ vm_reserv_alloc_page(vm_object_t object, vm_pindex_t pindex)
return (m);
}
}
- msucc = vm_radix_lookup_ge(&object->rtree, pindex);
+ msucc = vm_radix_lookup_ge(&object->rtree, pindex, VM_RADIX_BLACK);
if (msucc != NULL) {
KASSERT(msucc->pindex != pindex,
("vm_reserv_alloc_page: pindex already allocated"));
@@ -337,47 +336,6 @@ vm_reserv_alloc_page(vm_object_t object, vm_pindex_t pindex)
}
}
-#else
- msucc = NULL;
- mpred = object->root;
- 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, ...). */
- if ((m->flags & (PG_CACHED | PG_FREE)) == 0)
- return (NULL);
- vm_reserv_populate(rv);
- return (m);
- } else if (mpred->pindex < pindex) {
- if (msucc != NULL ||
- (msucc = TAILQ_NEXT(mpred, listq)) == NULL)
- break;
- 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);
- } else if (pindex < msucc->pindex)
- break;
- } else if (msucc == NULL) {
- msucc = mpred;
- mpred = TAILQ_PREV(msucc, pglist, listq);
- continue;
- }
- msucc = NULL;
- mpred = object->root = vm_page_splay(pindex, object->root);
- }
-#endif
-
/*
* Determine the first index to the left that can be used.
*/
OpenPOWER on IntegriCloud