diff options
author | Niels Provos <provos@cvs.openbsd.org> | 2002-02-25 05:38:51 +0000 |
---|---|---|
committer | Niels Provos <provos@cvs.openbsd.org> | 2002-02-25 05:38:51 +0000 |
commit | 8237f5c9ce826b7a309bc002b4cf70bc4ad7a56f (patch) | |
tree | 354694e4cfcf740ef189cdc82f1798dbcea6dec0 /sys/uvm | |
parent | 342e9c4d8c152cca72f38d2bd242536a47728ef7 (diff) |
back out red-black tree. they are very fast but alpha UVM is broken and
the tree triggers the bug, PMAP_PREFER case was broken also.
Diffstat (limited to 'sys/uvm')
-rw-r--r-- | sys/uvm/uvm_extern.h | 3 | ||||
-rw-r--r-- | sys/uvm/uvm_map.c | 435 | ||||
-rw-r--r-- | sys/uvm/uvm_map.h | 6 | ||||
-rw-r--r-- | sys/uvm/uvm_map_i.h | 3 |
4 files changed, 20 insertions, 427 deletions
diff --git a/sys/uvm/uvm_extern.h b/sys/uvm/uvm_extern.h index aafd01207ec..eb2f3358c1a 100644 --- a/sys/uvm/uvm_extern.h +++ b/sys/uvm/uvm_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_extern.h,v 1.41 2002/02/25 00:20:45 provos Exp $ */ +/* $OpenBSD: uvm_extern.h,v 1.42 2002/02/25 05:38:50 provos Exp $ */ /* $NetBSD: uvm_extern.h,v 1.57 2001/03/09 01:02:12 chs Exp $ */ /* @@ -373,7 +373,6 @@ extern struct uvmexp uvmexp; */ #include <sys/vmmeter.h> #include <sys/queue.h> -#include <sys/tree.h> #include <uvm/uvm_param.h> #include <sys/lock.h> #include <uvm/uvm_page.h> diff --git a/sys/uvm/uvm_map.c b/sys/uvm/uvm_map.c index 0bf712b09ed..4400ae70d2e 100644 --- a/sys/uvm/uvm_map.c +++ b/sys/uvm/uvm_map.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_map.c,v 1.39 2002/02/25 00:20:45 provos Exp $ */ +/* $OpenBSD: uvm_map.c,v 1.40 2002/02/25 05:38:50 provos Exp $ */ /* $NetBSD: uvm_map.c,v 1.86 2000/11/27 08:40:03 chs Exp $ */ /* @@ -83,7 +83,6 @@ #include <sys/shm.h> #endif -#define RB_AUGMENT(x) uvm_rb_augment(x) #define UVM_MAP #include <uvm/uvm.h> @@ -91,6 +90,7 @@ #include <uvm/uvm_ddb.h> #endif + struct uvm_cnt uvm_map_call, map_backmerge, map_forwmerge; struct uvm_cnt uvm_mlk_call, uvm_mlk_hint; const char vmmapbsy[] = "vmmapbsy"; @@ -134,7 +134,6 @@ vaddr_t uvm_maxkaddr; (entry)->next = (after_where)->next; \ (entry)->prev->next = (entry); \ (entry)->next->prev = (entry); \ - uvm_rb_insert(map, entry); \ } while (0) /* @@ -146,7 +145,6 @@ vaddr_t uvm_maxkaddr; (map)->nentries--; \ (entry)->next->prev = (entry)->prev; \ (entry)->prev->next = (entry)->next; \ - uvm_rb_remove(map, entry); \ } while (0) /* @@ -187,164 +185,6 @@ static void uvm_map_entry_unwire __P((vm_map_t, vm_map_entry_t)); static void uvm_map_reference_amap __P((vm_map_entry_t, int)); static void uvm_map_unreference_amap __P((vm_map_entry_t, int)); -int uvm_map_spacefits __P((vm_map_t, vaddr_t *, vsize_t, vm_map_entry_t, voff_t, vsize_t)); - -int _uvm_tree_sanity(vm_map_t map, char *name); -static int uvm_rb_subtree_space __P((vm_map_entry_t)); - -static __inline int -uvm_compare(vm_map_entry_t a, vm_map_entry_t b) -{ - if (a->start < b->start) - return (-1); - else if (a->start > b->start) - return (1); - - return (0); -} - - -static __inline void -uvm_rb_augment(vm_map_entry_t entry) -{ - entry->space = uvm_rb_subtree_space(entry); -} - -RB_PROTOTYPE(uvm_tree, vm_map_entry, rb_entry, uvm_compare); - -RB_GENERATE(uvm_tree, vm_map_entry, rb_entry, uvm_compare); - -static __inline int -uvm_rb_space(vm_map_t map, vm_map_entry_t entry) -{ - vm_map_entry_t next; - vaddr_t space; - - if ((next = entry->next) == &map->header) - space = map->max_offset - entry->end; - else { - KASSERT(next); - space = next->start - entry->end; - } - return (space); -} - -static int -uvm_rb_subtree_space(vm_map_entry_t entry) -{ - vaddr_t space, tmp; - - space = entry->ownspace; - if (RB_LEFT(entry, rb_entry)) { - tmp = RB_LEFT(entry, rb_entry)->space; - if (tmp > space) - space = tmp; - } - - if (RB_RIGHT(entry, rb_entry)) { - tmp = RB_RIGHT(entry, rb_entry)->space; - if (tmp > space) - space = tmp; - } - - return (space); -} - -static __inline void -uvm_rb_fixup(vm_map_t map, vm_map_entry_t entry) -{ - /* We need to traverse to the very top */ - do { - entry->ownspace = uvm_rb_space(map, entry); - entry->space = uvm_rb_subtree_space(entry); - } while ((entry = RB_PARENT(entry, rb_entry)) != NULL); -} - -static __inline void -uvm_rb_insert(vm_map_t map, vm_map_entry_t entry) -{ - vaddr_t space = uvm_rb_space(map, entry); - - entry->ownspace = entry->space = space; - RB_INSERT(uvm_tree, &(map)->rbhead, entry); - uvm_rb_fixup(map, entry); - if (entry->prev != &map->header) - uvm_rb_fixup(map, entry->prev); -} - -static __inline void -uvm_rb_remove(vm_map_t map, vm_map_entry_t entry) -{ - vm_map_entry_t parent; - - parent = RB_PARENT(entry, rb_entry); - RB_REMOVE(uvm_tree, &(map)->rbhead, entry); - if (entry->prev != &map->header) - uvm_rb_fixup(map, entry->prev); - if (parent) - uvm_rb_fixup(map, parent); -} - -#define uvm_tree_sanity(x,y) - -int -_uvm_tree_sanity(vm_map_t map, char *name) -{ - vm_map_entry_t tmp, trtmp; - int n = 0, i = 1; - - RB_FOREACH(tmp, uvm_tree, &map->rbhead) { - if (tmp->ownspace != uvm_rb_space(map, tmp)) { - printf("%s: %d/%d ownspace %x != %x %s\n", - name, n + 1, map->nentries, - tmp->ownspace, uvm_rb_space(map, tmp), - tmp->next == &map->header ? "(last)" : ""); - goto error; - } - } - trtmp = NULL; - RB_FOREACH(tmp, uvm_tree, &map->rbhead) { - if (tmp->space != uvm_rb_subtree_space(tmp)) { - printf("%s: space %d != %d\n", - name, tmp->space, uvm_rb_subtree_space(tmp)); - goto error; - } - if (trtmp != NULL && trtmp->start >= tmp->start) { - printf("%s: corrupt: %p >= %p\n", - name, trtmp->start, tmp->start); - goto error; - } - n++; - - trtmp = tmp; - } - - if (n != map->nentries) { - printf("%s: nentries: %d vs %d\n", - name, n, map->nentries); - goto error; - } - - for (tmp = map->header.next; tmp && tmp != &map->header; - tmp = tmp->next, i++) { - trtmp = RB_FIND(uvm_tree, &map->rbhead, tmp); - if (trtmp != tmp) { - printf("%s: lookup: %d: %p - %p: %p\n", - name, i, tmp, trtmp, - RB_PARENT(tmp, rb_entry)); - goto error; - } - } - - return (0); - error: -#ifdef DDB - /* handy breakpoint location for error case */ - __asm(".globl treesanity_label ; treesanity_label:"); -#endif - return (-1); -} - /* * local inlines */ @@ -549,8 +389,6 @@ void uvm_map_clip_start(map, entry, start) /* uvm_map_simplify_entry(map, entry); */ /* XXX */ - uvm_tree_sanity(map, "clip_start entry"); - /* * Split off the front portion. note that we must insert the new * entry BEFORE this one, so that this entry has the specified @@ -564,8 +402,6 @@ void uvm_map_clip_start(map, entry, start) new_adj = start - new_entry->start; if (entry->object.uvm_obj) entry->offset += new_adj; /* shift start over */ - - /* Does not change order for the RB tree */ entry->start = start; if (new_entry->aref.ar_amap) { @@ -584,8 +420,6 @@ void uvm_map_clip_start(map, entry, start) entry->object.uvm_obj->pgops->pgo_reference( entry->object.uvm_obj); } - - uvm_tree_sanity(map, "clip_start leave"); } /* @@ -606,7 +440,6 @@ uvm_map_clip_end(map, entry, end) vm_map_entry_t new_entry; vaddr_t new_adj; /* #bytes we move start forward */ - uvm_tree_sanity(map, "clip_end entry"); /* * Create a new entry and insert it * AFTER the specified entry @@ -622,8 +455,6 @@ uvm_map_clip_end(map, entry, end) if (entry->aref.ar_amap) amap_splitref(&entry->aref, &new_entry->aref, new_adj); - - uvm_rb_fixup(map, entry); uvm_map_entry_link(map, entry, new_entry); @@ -637,7 +468,6 @@ uvm_map_clip_end(map, entry, end) entry->object.uvm_obj->pgops->pgo_reference( entry->object.uvm_obj); } - uvm_tree_sanity(map, "clip_end leave"); } @@ -692,8 +522,6 @@ uvm_map(map, startp, size, uobj, uoffset, align, flags) map, *startp, size, flags); UVMHIST_LOG(maphist, " uobj/offset 0x%x/%d", uobj, uoffset,0,0); - uvm_tree_sanity(map, "map entry"); - /* * step 0: sanity check of protection code */ @@ -816,11 +644,8 @@ uvm_map(map, startp, size, uobj, uoffset, align, flags) } prev_entry->end += size; - uvm_rb_fixup(map, prev_entry); map->size += size; - uvm_tree_sanity(map, "map leave 2"); - UVMHIST_LOG(maphist,"<- done (via backmerge)!", 0, 0, 0, 0); vm_map_unlock(map); return (KERN_SUCCESS); @@ -892,8 +717,6 @@ step3: (prev_entry->end >= new_entry->start)) map->first_free = new_entry; - uvm_tree_sanity(map, "map leave"); - UVMHIST_LOG(maphist,"<- done!", 0, 0, 0, 0); vm_map_unlock(map); return(KERN_SUCCESS); @@ -915,7 +738,6 @@ uvm_map_lookup_entry(map, address, entry) { vm_map_entry_t cur; vm_map_entry_t last; - int use_tree = 0; UVMHIST_FUNC("uvm_map_lookup_entry"); UVMHIST_CALLED(maphist); @@ -955,43 +777,12 @@ uvm_map_lookup_entry(map, address, entry) cur, 0, 0, 0); return (TRUE); } - - if (map->nentries > 30) - use_tree = 1; } else { /* * go from start to hint, *inclusively* */ last = cur->next; cur = map->header.next; - use_tree = 1; - } - - uvm_tree_sanity(map, __FUNCTION__); - - if (use_tree) { - vm_map_entry_t prev = &map->header; - cur = RB_ROOT(&map->rbhead); - - /* - * Simple lookup in the tree. Happens when the hint is - * invalid, or nentries reach a threshold. - */ - while (cur) { - if (address >= cur->start) { - if (address < cur->end) { - *entry = cur; - SAVE_HINT(map, map->hint, cur); - return (TRUE); - } - prev = cur; - cur = RB_RIGHT(cur, rb_entry); - } else - cur = RB_LEFT(cur, rb_entry); - } - *entry = prev; - UVMHIST_LOG(maphist,"<- failed!",0,0,0,0); - return (FALSE); } /* @@ -1016,7 +807,6 @@ uvm_map_lookup_entry(map, address, entry) } cur = cur->next; } - *entry = cur->prev; SAVE_HINT(map, map->hint, *entry); UVMHIST_LOG(maphist,"<- failed!",0,0,0,0); @@ -1024,40 +814,6 @@ uvm_map_lookup_entry(map, address, entry) } /* - * Checks if address pointed to be phint fits into the empty - * space before the vm_map_entry after. Takes aligment and - * offset into consideration. - */ - -int -uvm_map_spacefits(vm_map_t map, vaddr_t *phint, vsize_t length, - vm_map_entry_t after, voff_t uoffset, vsize_t align) -{ - vaddr_t hint = *phint; - vaddr_t end; - -#ifdef PMAP_PREFER - /* - * push hint forward as needed to avoid VAC alias problems. - * we only do this if a valid offset is specified. - */ - if (uoffset != UVM_UNKNOWN_OFFSET) - PMAP_PREFER(uoffset, &hint); -#endif - if (align != 0) - if ((hint & (align - 1)) != 0) - hint = roundup(hint, align); - end = hint + length; - if (end > map->max_offset || end < hint) - return (FALSE); - if (after != NULL && after != &map->header && after->start < end) - return (FALSE); - - *phint = hint; - return (TRUE); -} - -/* * uvm_map_findspace: find "length" sized space in "map". * * => "hint" is a hint about where we want it, unless FINDSPACE_FIXED is @@ -1082,8 +838,6 @@ uvm_map_findspace(map, hint, length, result, uobj, uoffset, align, flags) int flags; { vm_map_entry_t entry, next, tmp; - vm_map_entry_t child, prev = NULL; - vaddr_t end, orig_hint; UVMHIST_FUNC("uvm_map_findspace"); UVMHIST_CALLED(maphist); @@ -1093,8 +847,6 @@ uvm_map_findspace(map, hint, length, result, uobj, uoffset, align, flags) KASSERT((align & (align - 1)) == 0); KASSERT((flags & UVM_FLAG_FIXED) == 0 || align == 0); - uvm_tree_sanity(map, "map_findspace entry"); - /* * remember the original hint. if we are aligning, then we * may have to try again with no alignment constraint if @@ -1136,123 +888,6 @@ uvm_map_findspace(map, hint, length, result, uobj, uoffset, align, flags) entry = tmp; } - if (flags & UVM_FLAG_FIXED) { -#ifdef PMAP_PREFER - /* - * push hint forward as needed to avoid VAC alias problems. - * we only do this if a valid offset is specified. - */ - if (uoffset != UVM_UNKNOWN_OFFSET) - PMAP_PREFER(uoffset, &hint); -#endif - if (align != 0) { - if ((hint & (align - 1)) != 0) - hint = roundup(hint, align); - /* - * XXX Should we PMAP_PREFER() here again? - */ - } - end = hint + length; - if (end > map->max_offset || end < hint) { - UVMHIST_LOG(maphist,"<- failed (off end)", 0,0,0,0); - goto error; - } - next = entry->next; - if (next == &map->header || next->start >= end) - goto found; - UVMHIST_LOG(maphist,"<- fixed mapping failed", 0,0,0,0); - return(NULL); /* only one shot at it ... */ - } - - /* Try to find the space in the red-black tree */ - - /* Check slot before any entry */ - tmp = map->header.next; - if (uvm_map_spacefits(map, &hint, length, tmp, uoffset, align)) { - entry = map->first_free; - goto found; - } - - /* If there is not enough space in the whole tree, we fail */ - tmp = RB_ROOT(&map->rbhead); - if (tmp == NULL || tmp->space < length) - goto error; - - /* Find an entry close to hint that has enough space */ - for (; tmp;) { - if (tmp->start > hint && - (prev == NULL || tmp->start < prev->start)) { - if (tmp->ownspace >= length) - prev = tmp; - else if ((child = RB_RIGHT(tmp, rb_entry)) != NULL && - child->space >= length) - prev = tmp; - } - if (tmp->start < hint) - child = RB_RIGHT(tmp, rb_entry); - else if (tmp->start > hint) - child = RB_LEFT(tmp, rb_entry); - else { - if (tmp->ownspace >= length) - break; - child = RB_RIGHT(tmp, rb_entry); - } - if (child == NULL || child->space < length) - break; - tmp = child; - } - - if (tmp != NULL) { - /* - * Check if the entry that we found satifies the - * space requirement - */ - if (hint < tmp->end) - hint = tmp->end; - if (uvm_map_spacefits(map, &hint, length, tmp->next, uoffset, - align)) { - entry = tmp; - hint = hint; - goto found; - } - } - if (prev == NULL) - goto error; - - hint = prev->end; - if (uvm_map_spacefits(map, &hint, length, prev->next, uoffset, - align)) { - entry = prev; - goto found; - } - - if ((tmp = RB_RIGHT(prev, rb_entry)) == NULL || - tmp->space < length) - goto error; - - for (;;) { - KASSERT(tmp && tmp->space >= length); - child = RB_LEFT(tmp, rb_entry); - if (child && child->space >= length) { - tmp = child; - continue; - } - if (tmp->ownspace >= length) - break; - tmp = RB_RIGHT(tmp, rb_entry); - } - - hint = tmp->end; - if (uvm_map_spacefits(map, &hint, length, tmp->next, uoffset, align)) { - entry = tmp; - goto found; - } - - /* - * The tree fails to find an entry because of offset or alignment - * restrictions. Search the list instead. - */ - /* * Look through the rest of the map, trying to fit a new region in * the gap between existing regions, or after the very last region. @@ -1273,7 +908,8 @@ uvm_map_findspace(map, hint, length, result, uobj, uoffset, align, flags) * push hint forward as needed to avoid VAC alias problems. * we only do this if a valid offset is specified. */ - if (uoffset != UVM_UNKNOWN_OFFSET) + if ((flags & UVM_FLAG_FIXED) == 0 && + uoffset != UVM_UNKNOWN_OFFSET) PMAP_PREFER(uoffset, &hint); #endif if (align != 0) { @@ -1286,27 +922,27 @@ uvm_map_findspace(map, hint, length, result, uobj, uoffset, align, flags) end = hint + length; if (end > map->max_offset || end < hint) { UVMHIST_LOG(maphist,"<- failed (off end)", 0,0,0,0); - goto error; + if (align != 0) { + UVMHIST_LOG(maphist, + "calling recursively, no align", + 0,0,0,0); + return (uvm_map_findspace(map, orig_hint, + length, result, uobj, uoffset, 0, flags)); + } + return (NULL); } next = entry->next; if (next == &map->header || next->start >= end) break; + if (flags & UVM_FLAG_FIXED) { + UVMHIST_LOG(maphist,"<- fixed mapping failed", 0,0,0,0); + return(NULL); /* only one shot at it ... */ + } } - found: SAVE_HINT(map, map->hint, entry); *result = hint; UVMHIST_LOG(maphist,"<- got it! (result=0x%x)", hint, 0,0,0); return (entry); - - error: - if (align != 0) { - UVMHIST_LOG(maphist, - "calling recursively, no align", - 0,0,0,0); - return (uvm_map_findspace(map, orig_hint, - length, result, uobj, uoffset, 0, flags)); - } - return (NULL); } /* @@ -1338,8 +974,6 @@ uvm_unmap_remove(map, start, end, entry_list) VM_MAP_RANGE_CHECK(map, start, end); - uvm_tree_sanity(map, "unmap_remove entry"); - /* * find first entry */ @@ -1485,8 +1119,6 @@ uvm_unmap_remove(map, start, end, entry_list) entry = next; /* next entry, please */ } - uvm_tree_sanity(map, "unmap_remove leave"); - /* * now we've cleaned up the map and are ready for the caller to drop * references to the mapped objects. @@ -1613,8 +1245,6 @@ uvm_map_replace(map, start, end, newents, nnewents) { vm_map_entry_t oldent, last; - uvm_tree_sanity(map, "map_replace entry"); - /* * first find the blank map entry at the specified address */ @@ -1671,6 +1301,7 @@ uvm_map_replace(map, start, end, newents, nnewents) */ if (newents) { + last = newents->prev; /* we expect this */ /* critical: flush stale hints out of map */ @@ -1680,25 +1311,10 @@ uvm_map_replace(map, start, end, newents, nnewents) last->next = oldent->next; last->next->prev = last; - - /* Fix RB tree */ - uvm_rb_remove(map, oldent); - newents->prev = oldent->prev; newents->prev->next = newents; map->nentries = map->nentries + (nnewents - 1); - /* Fixup the RB tree */ - { - int i; - vm_map_entry_t tmp; - - tmp = newents; - for (i = 0; i < nnewents && tmp; i++) { - uvm_rb_insert(map, tmp); - tmp = tmp->next; - } - } } else { /* critical: flush stale hints out of map */ @@ -1711,8 +1327,6 @@ uvm_map_replace(map, start, end, newents, nnewents) } - uvm_tree_sanity(map, "map_replace leave"); - /* * now we can free the old blank entry, unlock the map and return. */ @@ -1758,9 +1372,6 @@ uvm_map_extract(srcmap, start, len, dstmap, dstaddrp, flags) len,0); UVMHIST_LOG(maphist," ...,dstmap=0x%x, flags=0x%x)", dstmap,flags,0,0); - uvm_tree_sanity(srcmap, "map_extract src enter"); - uvm_tree_sanity(dstmap, "map_extract dst enter"); - /* * step 0: sanity check: start must be on a page boundary, length * must be page sized. can't ask for CONTIG/QREF if you asked for @@ -2038,10 +1649,6 @@ uvm_map_extract(srcmap, start, len, dstmap, dstaddrp, flags) goto bad2; } } - - uvm_tree_sanity(srcmap, "map_extract src leave"); - uvm_tree_sanity(dstmap, "map_extract dst leave"); - return(0); /* @@ -2053,10 +1660,6 @@ bad2: /* src already unlocked */ if (chain) uvm_unmap_detach(chain, (flags & UVM_EXTRACT_QREF) ? AMAP_REFALL : 0); - - uvm_tree_sanity(srcmap, "map_extract src err leave"); - uvm_tree_sanity(dstmap, "map_extract dst err leave"); - uvm_unmap(dstmap, dstaddr, dstaddr+len); /* ??? */ return(error); } @@ -3222,11 +2825,7 @@ uvmspace_exec(p, start, end) */ vm_map_lock(map); map->min_offset = start; - uvm_tree_sanity(map, "resize enter"); map->max_offset = end; - if (map->header.prev != &map->header) - uvm_rb_fixup(map, map->header.prev); - uvm_tree_sanity(map, "resize leave"); vm_map_unlock(map); diff --git a/sys/uvm/uvm_map.h b/sys/uvm/uvm_map.h index 36e5707f1c9..1fd0c00f196 100644 --- a/sys/uvm/uvm_map.h +++ b/sys/uvm/uvm_map.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_map.h,v 1.22 2002/02/25 00:20:45 provos Exp $ */ +/* $OpenBSD: uvm_map.h,v 1.23 2002/02/25 05:38:50 provos Exp $ */ /* $NetBSD: uvm_map.h,v 1.24 2001/02/18 21:19:08 chs Exp $ */ /* @@ -139,9 +139,6 @@ union vm_map_object { * Also included is control information for virtual copy operations. */ struct vm_map_entry { - RB_ENTRY(vm_map_entry) rb_entry; /* tree information */ - vaddr_t ownspace; /* free space after */ - vaddr_t space; /* space in subtree */ struct vm_map_entry *prev; /* previous entry */ struct vm_map_entry *next; /* next entry */ vaddr_t start; /* start address */ @@ -220,7 +217,6 @@ struct vm_map_entry { struct vm_map { struct pmap * pmap; /* Physical map */ lock_data_t lock; /* Lock for map data */ - RB_HEAD(uvm_tree, vm_map_entry) rbhead; /* Tree for entries */ struct vm_map_entry header; /* List of entries */ int nentries; /* Number of entries */ vsize_t size; /* virtual size */ diff --git a/sys/uvm/uvm_map_i.h b/sys/uvm/uvm_map_i.h index 4556f48e6a8..cb171708215 100644 --- a/sys/uvm/uvm_map_i.h +++ b/sys/uvm/uvm_map_i.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_map_i.h,v 1.13 2002/02/25 00:20:45 provos Exp $ */ +/* $OpenBSD: uvm_map_i.h,v 1.14 2002/02/25 05:38:50 provos Exp $ */ /* $NetBSD: uvm_map_i.h,v 1.18 2000/11/27 08:40:04 chs Exp $ */ /* @@ -114,7 +114,6 @@ uvm_map_setup(map, min, max, flags) int flags; { - RB_INIT(&map->rbhead); map->header.next = map->header.prev = &map->header; map->nentries = 0; map->size = 0; |