Subject: Re: libkern's rb tree
To: Joerg Sonnenberger <joerg@britannica.bec.de>
From: Jason Thorpe <thorpej@shagadelic.org>
List: tech-kern
Date: 10/22/2007 18:29:02
On Oct 18, 2007, at 2:31 PM, Joerg Sonnenberger wrote:

> The first concern is that the code doesn't allow "type safe" usage. I
> have a set of wrapping code that avoids this by creating inline glue
> for a very small cost. IMO this is necessary feature before actual
> wide-spread use.

The lack of type safety doesn't really bother me.  This would be no  
different for generic hash table routines, etc.  In any case, we're  
written in C, and void * is what we get if we don't want wrappers  
(which increase code size) or code duplication (which increases code  
size).

> The second concern is the use of the sentinel nodes. Having done the  
> rb
> tree myself I'm sure that they save very little actual code and might
> have even increased the size.

Again, sentinel nodes don't bother me.  And, as documented in the  
code, using them enables a couple of clever optimizations.  Matt  
designed that rb code to be used for a MIPS pmap module, and wanted it  
to be small and fast, and shaving cycles was a primary concern.

> The third concern is generality. The only use of sys/tree.h in the
> kernel is uvm right now and that does some nasty things with  
> RB_AUGMENT.
> We can't replace that with the current rb_moved. If we want to have a
> single copy in the tree, we need a callback whenever a child of a node
> changes. That adds a conditional to a lot of branches though.

Having a callback could take a separate path (i.e. duplicate some  
small amount of code within rb.c itself).  That said, it seems like  
uvm_map.c could compute that information lazily, thus eliminating the  
need for the "augment" altogether, and actually improving performance  
(you only need to know a sub-tree's available space when attempting to  
allocate from the map, so why constantly recompute it when e.g.  
removing mappings?)

> The last concern is about memory usage. If doing all the above, only  
> two
> bits of storage are needed for each node (color and position). I think
> that should be merged into the parent pointer. Based on my own tests,
> this is approximately free on i386 as the bitfield access is as bad as
> modifying the parent pointer and the parent pointer needs to be  
> changed
> in most cases already.

My memory usage concern is more about code size rather than data size.

-- thorpej