On Wed, Oct 26, 2016 at 09:18:01PM +0200, David Herrmann wrote: > +/* insert slice into the free tree */ > +static void bus1_pool_slice_link_free(struct bus1_pool_slice *slice, > + struct bus1_pool *pool) > +{ > + struct rb_node **n, *prev = NULL; > + struct bus1_pool_slice *ps; > + > + n = &pool->slices_free.rb_node; > + while (*n) { > + prev = *n; > + ps = container_of(prev, struct bus1_pool_slice, rb); > + if (slice->size < ps->size) > + n = &prev->rb_left; > + else > + n = &prev->rb_right; > + } > + > + rb_link_node(&slice->rb, prev, n); > + rb_insert_color(&slice->rb, &pool->slices_free); > +}
If you only sort free slices by size, how do you merge contiguous free slices? > +/* find free slice big enough to hold @size bytes */ > +static struct bus1_pool_slice * > +bus1_pool_slice_find_by_size(struct bus1_pool *pool, size_t size) > +{ > + struct bus1_pool_slice *ps, *closest = NULL; > + struct rb_node *n; > + > + n = pool->slices_free.rb_node; > + while (n) { > + ps = container_of(n, struct bus1_pool_slice, rb); > + if (size < ps->size) { > + closest = ps; > + n = n->rb_left; > + } else if (size > ps->size) { > + n = n->rb_right; > + } else /* if (size == ps->size) */ { > + return ps; > + } > + } > + > + return closest; > +} > + > +/* find used slice with given offset */ > +static struct bus1_pool_slice * > +bus1_pool_slice_find_by_offset(struct bus1_pool *pool, size_t offset) > +{ > + struct bus1_pool_slice *ps; > + struct rb_node *n; > + > + n = pool->slices_busy.rb_node; > + while (n) { > + ps = container_of(n, struct bus1_pool_slice, rb); > + if (offset < ps->offset) > + n = n->rb_left; > + else if (offset > ps->offset) > + n = n->rb_right; > + else /* if (offset == ps->offset) */ > + return ps; > + } > + > + return NULL; > +} I find these two function names misleading. They don't find_by_size or find_by_offset. They find_free_by_size and find_busy_by_offset. You could reduce that to find_free and find_busy and have the 'size' and 'offset' in the argument name.