Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936529AbcJ0NvV (ORCPT ); Thu, 27 Oct 2016 09:51:21 -0400 Received: from bombadil.infradead.org ([198.137.202.9]:52427 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936391AbcJ0NvO (ORCPT ); Thu, 27 Oct 2016 09:51:14 -0400 Date: Thu, 27 Oct 2016 14:59:07 +0200 From: Peter Zijlstra To: David Herrmann Cc: linux-kernel@vger.kernel.org, Andy Lutomirski , Jiri Kosina , Greg KH , Hannes Reinecke , Steven Rostedt , Arnd Bergmann , Tom Gundersen , Josh Triplett , Linus Torvalds , Andrew Morton Subject: Re: [RFC v1 05/14] bus1: util - pool utility library Message-ID: <20161027125907.GF3175@twins.programming.kicks-ass.net> References: <20161026191810.12275-1-dh.herrmann@gmail.com> <20161026191810.12275-6-dh.herrmann@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20161026191810.12275-6-dh.herrmann@gmail.com> User-Agent: Mutt/1.5.23.1 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2046 Lines: 73 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.