splay tree and red-black tree for vm_map entry lookups.

Eirik Nygaard eirikn at kerneled.com
Wed Jan 19 11:35:41 PST 2005


On Wed, Jan 19, 2005 at 11:12:56AM -0800, Matthew Dillon wrote:
> 
> :>     Lets go with the red-black approach.   I will patch it in and start
> :>     testing it myself.  It looks like NetBSD has done their homework though
> :>     and I expect we will be able to commit it by the end of the week.
> :
> :I did add some code that used the hint, but for some reason it made my computer
> :go crazy at boot, and the login just went dead, could enter a login name but
> :'login:' just poped back out. I am having some trouble seeing why this could go
> :so bad. The hint code is in this patch:
> :http://leaf.dragonflybsd.org/~eirikn/vm_map-rb-tree-netbsd-eirikn-hint.patch
> :
> :-- 
> :Eirik Nygaard
> 
[...]
>     Then the only reason it could possibly fail is if the hint is
>     not being reset back to &map->header (or to some other valid entry)
>     when the entry it represents is deleted.
> 
>     This is occuring because the hint code is depending on
>     vm_map_lookup_entry() to set the hint in the case where the lookup fails,
>     and you removed that part of the code, thus leaving the hint set to
>     the entry you are about to delete.
> 
>     But it was very fragile code anyway.  I recommend just setting the
>     hint unconditionally in vm_map_delete() rather then depending on an
>     undocumented side effect of vm_map_lookup_entry():
> 
>         if (!vm_map_lookup_entry(map, start, &first_entry)) {
>                 entry = first_entry->next;
>                 SAVE_HINT(map, &map->header);	<<<<<< ADDME
>         } else {
>                 entry = first_entry;
>                 vm_map_clip_start(map, entry, start, countp);
>                 /*
>                  * Fix the lookup hint now, rather than each time though the
>                  * loop.
>                  */
>                 SAVE_HINT(map, entry->prev);
>         }

I did the same as vm_map_lookup_entry() did, and the else { } does above and
set the hint one entry back in the list.

> 
>     And while you are at it, get rid of the SAVE_HINT macro junk and just
>     use a direct assignment to map->hint :-)
Sure thing.
> 
>     Test it and then resubmit the whole cleaned up and hinted patch.
Works a lot better now (I can log in and everything).

http://leaf.dragonflybsd.org/~eirikn/vm_map-rb-tree-netbsd-eirikn-hint.patch

-- 
Eirik Nygaard





More information about the Kernel mailing list