linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Davidlohr Bueso <dave@stgolabs.net>
To: Michel Lespinasse <walken@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	David Howells <dhowells@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 2/3] augmented rbtree: add new RB_DECLARE_CALLBACKS_MAX macro
Date: Tue, 13 Aug 2019 17:06:16 -0700	[thread overview]
Message-ID: <20190814000616.sd4mxwsewhqqz6ra@linux-r8p5> (raw)
In-Reply-To: <CANN689HVDJXKEwB80yPAVwvRwnV4HfiucQVAho=dupKM_iKozw@mail.gmail.com>

On Tue, 02 Jul 2019, Michel Lespinasse wrote:
>Ehhh, I have my own list of gripes about interval tree (I'm
>responsible for some of these too):

Sorry just getting back to this.

>
>- The majority of interval tree users (though either the
>interval_tree.h or the interval_tree_generic.h API) do not store any
>overlapping intervals, and as such they really don't have any reason
>to use an augmented rbtree in the first place. This seems to be true
>for at least drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c,
>drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c, drivers/gpu/drm/drm_mm.c,
>drivers/gpu/drm/radeon/radeon_mn.c,
>drivers/infiniband/hw/usnic/usnic_uiom_interval_tree.c, and probably
>(not 100% sure) also drivers/infiniband/hw/hfi1/mmu_rb.c and
>drivers/vhost/vhost.c. I think the reason they do that is because they
>like to have the auto-generated insert / remove / iter functions
>rather than writing their own as they would have to do through the
>base rbtree API. Not necessarily a huge problem but it is annoying
>when working on inteval tree to consider that the data structure is
>not optimal for most of its users.

I think the patch I sent earlier will add to your unhappiness.

>
>- The intervals are represented as [start, last], where most
>everything else in the kernel uses [start, end[ (with last == end -
>1). The reason it was done that way was for stabbing queries - I
>thought these would be nicer to represent as a [stab, stab] interval
>rather than [stab, stab+1[. But, things didn't turn out that way
>because of huge pages, and we end up with stabbing queries in the
>[stab, stab + page_size - 1] format, at which point we could just as
>easily go for [stab, stab + page_size[ representation. Having looked
>into it, my understanding is that *all* current users of the interval
>tree API would be better served if the intervals were represented as
>[start, end[ like everywhere else in the kernel.
>
>- interval_tree_generic.h refers to interval_tree.h as being the
>generic one. I think this is quite confusing. To me
>interval_tree_generic is the generic implementation (it works with any
>scalar ITTYPE), and interval_tree.h is the specialized version (it
>works with unsigned long keys only). Fun fact, interval_tree.[c,h] was
>initially only meant as sample / test code - I thought everyone would
>use the generic version. Not a big deal, it's probably better for
>everyone to use the specialized version when applicable (unless they
>don't really need overlapping intervals in the first place, but that's
>a separate gripe).
>
>- I don't like that interval tree API forces rb_leftmost caching on
>its users. I'm not sure what was the use case that motivated it, but I
>don' think it's a relevant optimization for most users - I can only
>see a benefit if people are frequently calling the iter_first function
>with a search interval that is to the left of the leftmost entry, and
>that doesn't seem to be relevant to the general case (in the general
>case, maintaining leftmost has a O(1) cost and its benefit is only
>expected to show up in 1/N cases, ....)

Right, so this was done originally for optimizing range locking which
needed to do the iter_first a lot. fwiw pat_rbtree tree could also use
it before insertion. While I did not examine the other users of interval_tree,
I considered it overall worthwhile having; it comes at pretty
much no cost and the extra footprint has not been a problem so far for
users.

>
>Going back to your specific pat_rbtree.c comment, I think using
>interval trees could still work. The issue with end is the typical one
>([start, last] vs [start, end[) which can be worked around by
>adjusting the end by 1 (still hate having to do that though). The
>issue with insertion order may possibly not matter, as
>memtype_rb_check_conflict verifies that any overlapping ranges will
>have the same configured memory type. So maybe the order doesn't
>matter in the end ??? Not 100% sure about that one.

I've sent out a patch.

Thanks,
Davidlohr



  reply	other threads:[~2019-08-14  0:07 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-02  7:58 [PATCH v2 0/3] make RB_DECLARE_CALLBACKS more generic Michel Lespinasse
2019-07-02  7:58 ` [PATCH v2 1/3] augmented rbtree: add comments for RB_DECLARE_CALLBACKS macro Michel Lespinasse
2019-07-02 16:11   ` Davidlohr Bueso
2019-07-02  7:58 ` [PATCH v2 2/3] augmented rbtree: add new RB_DECLARE_CALLBACKS_MAX macro Michel Lespinasse
2019-07-02 16:09   ` Davidlohr Bueso
2019-07-03  2:14     ` Michel Lespinasse
2019-08-14  0:06       ` Davidlohr Bueso [this message]
2019-08-21 22:18         ` Michel Lespinasse
2019-07-02  7:58 ` [PATCH v2 3/3] augmented rbtree: rework the RB_DECLARE_CALLBACKS macro definition Michel Lespinasse
2019-07-02 11:52   ` Peter Zijlstra
2019-07-03  1:12     ` Michel Lespinasse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190814000616.sd4mxwsewhqqz6ra@linux-r8p5 \
    --to=dave@stgolabs.net \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=walken@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).