diff options
author | attilio <attilio@FreeBSD.org> | 2011-10-22 23:34:37 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2011-10-22 23:34:37 +0000 |
commit | c2583b69223bbb2f34d00ff0f0812dfa7c672c33 (patch) | |
tree | 89b968a21be39b83e0cd8f58985df4307fc3501d /sys/vm/vm_reserv.c | |
parent | 4be1d1f7d25274261562ad10fb8197d48da0d113 (diff) | |
download | FreeBSD-src-c2583b69223bbb2f34d00ff0f0812dfa7c672c33.zip FreeBSD-src-c2583b69223bbb2f34d00ff0f0812dfa7c672c33.tar.gz |
Check in an intial implementation of radix tree implementation to replace
the vm object pages splay.
TODO:
- Handle differently the negative keys for having smaller depth
index nodes (negative keys caming from indirect blocks)
- Fix the get_node() by having support for a low reserved objects
directly from UMA
- Implement the lookup_le and re-enable VM_NRESERVELEVEL = 1
- Try to rework the superpage splay of idle pages and the cache splay
for every vm object in order to regain space on vm_page structure
- Verify performance and improve them (likely by having consumers to deal
with several ranges of pages manually?)
Obtained from: jeff, Mayur Shardul (GSoC 2009)
Diffstat (limited to 'sys/vm/vm_reserv.c')
-rw-r--r-- | sys/vm/vm_reserv.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/sys/vm/vm_reserv.c b/sys/vm/vm_reserv.c index fec0539..376f643 100644 --- a/sys/vm/vm_reserv.c +++ b/sys/vm/vm_reserv.c @@ -309,6 +309,35 @@ 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); + 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)]; + if ((m->flags & (PG_CACHED | PG_FREE)) == 0) + return (NULL); + vm_reserv_populate(rv); + return (m); + } + } + msucc = vm_radix_lookup_ge(&object->rtree, pindex); + 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)]; + if ((m->flags & (PG_CACHED | PG_FREE)) == 0) + return (NULL); + vm_reserv_populate(rv); + return (m); + } + } + +#else msucc = NULL; mpred = object->root; while (mpred != NULL) { @@ -347,6 +376,7 @@ vm_reserv_alloc_page(vm_object_t object, vm_pindex_t pindex) msucc = NULL; mpred = object->root = vm_page_splay(pindex, object->root); } +#endif /* * Determine the first index to the left that can be used. |