diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2014-03-17 08:21:54 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-05-05 03:09:14 -0400 |
commit | a88cc108f6f39e56577793f66ac69eb0e18ae099 (patch) | |
tree | ea07f899e8d482e15654d06d7df9aae857166dda | |
parent | 8d4eee9cd7a170342dc6fbc2ee19ae77031a8cd5 (diff) |
lib: Export interval_tree
lib/interval_tree.c provides a simple interface for an interval-tree
(an augmented red-black tree) but is only built when testing the generic
macros for building interval-trees. For drivers with modest needs,
export the simple interval-tree library as is.
v2: Lots of help from Michel Lespinasse to only compile the code
as required:
- make INTERVAL_TREE a config option
- make INTERVAL_TREE_TEST select the library functions
and sanitize the filenames & Makefile
- prepare interval_tree for being built as a module if required
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michel Lespinasse <walken@google.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Michel Lespinasse <walken@google.com>
[Acked for inclusion via drm/i915 by Andrew Morton.]
[danvet: switch to _GPL as per the mailing list discussion.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | lib/Kconfig | 14 | ||||
-rw-r--r-- | lib/Kconfig.debug | 1 | ||||
-rw-r--r-- | lib/Makefile | 3 | ||||
-rw-r--r-- | lib/interval_tree.c | 6 | ||||
-rw-r--r-- | lib/interval_tree_test.c (renamed from lib/interval_tree_test_main.c) | 0 |
5 files changed, 22 insertions, 2 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index 4771fb3f4da4..334f7722a999 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
@@ -331,6 +331,20 @@ config TEXTSEARCH_FSM | |||
331 | config BTREE | 331 | config BTREE |
332 | boolean | 332 | boolean |
333 | 333 | ||
334 | config INTERVAL_TREE | ||
335 | boolean | ||
336 | help | ||
337 | Simple, embeddable, interval-tree. Can find the start of an | ||
338 | overlapping range in log(n) time and then iterate over all | ||
339 | overlapping nodes. The algorithm is implemented as an | ||
340 | augmented rbtree. | ||
341 | |||
342 | See: | ||
343 | |||
344 | Documentation/rbtree.txt | ||
345 | |||
346 | for more information. | ||
347 | |||
334 | config ASSOCIATIVE_ARRAY | 348 | config ASSOCIATIVE_ARRAY |
335 | bool | 349 | bool |
336 | help | 350 | help |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 819ac51202c0..4bff173fef0a 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -1496,6 +1496,7 @@ config RBTREE_TEST | |||
1496 | config INTERVAL_TREE_TEST | 1496 | config INTERVAL_TREE_TEST |
1497 | tristate "Interval tree test" | 1497 | tristate "Interval tree test" |
1498 | depends on m && DEBUG_KERNEL | 1498 | depends on m && DEBUG_KERNEL |
1499 | select INTERVAL_TREE | ||
1499 | help | 1500 | help |
1500 | A benchmark measuring the performance of the interval tree library | 1501 | A benchmark measuring the performance of the interval tree library |
1501 | 1502 | ||
diff --git a/lib/Makefile b/lib/Makefile index 0cd7b68e1382..2c6c1a42e1d2 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -50,6 +50,7 @@ CFLAGS_hweight.o = $(subst $(quote),,$(CONFIG_ARCH_HWEIGHT_CFLAGS)) | |||
50 | obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o | 50 | obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o |
51 | 51 | ||
52 | obj-$(CONFIG_BTREE) += btree.o | 52 | obj-$(CONFIG_BTREE) += btree.o |
53 | obj-$(CONFIG_INTERVAL_TREE) += interval_tree.o | ||
53 | obj-$(CONFIG_ASSOCIATIVE_ARRAY) += assoc_array.o | 54 | obj-$(CONFIG_ASSOCIATIVE_ARRAY) += assoc_array.o |
54 | obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o | 55 | obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o |
55 | obj-$(CONFIG_DEBUG_LIST) += list_debug.o | 56 | obj-$(CONFIG_DEBUG_LIST) += list_debug.o |
@@ -156,8 +157,6 @@ lib-$(CONFIG_LIBFDT) += $(libfdt_files) | |||
156 | obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o | 157 | obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o |
157 | obj-$(CONFIG_INTERVAL_TREE_TEST) += interval_tree_test.o | 158 | obj-$(CONFIG_INTERVAL_TREE_TEST) += interval_tree_test.o |
158 | 159 | ||
159 | interval_tree_test-objs := interval_tree_test_main.o interval_tree.o | ||
160 | |||
161 | obj-$(CONFIG_PERCPU_TEST) += percpu_test.o | 160 | obj-$(CONFIG_PERCPU_TEST) += percpu_test.o |
162 | 161 | ||
163 | obj-$(CONFIG_ASN1) += asn1_decoder.o | 162 | obj-$(CONFIG_ASN1) += asn1_decoder.o |
diff --git a/lib/interval_tree.c b/lib/interval_tree.c index e6eb406f2d65..f367f9ad544c 100644 --- a/lib/interval_tree.c +++ b/lib/interval_tree.c | |||
@@ -1,6 +1,7 @@ | |||
1 | #include <linux/init.h> | 1 | #include <linux/init.h> |
2 | #include <linux/interval_tree.h> | 2 | #include <linux/interval_tree.h> |
3 | #include <linux/interval_tree_generic.h> | 3 | #include <linux/interval_tree_generic.h> |
4 | #include <linux/module.h> | ||
4 | 5 | ||
5 | #define START(node) ((node)->start) | 6 | #define START(node) ((node)->start) |
6 | #define LAST(node) ((node)->last) | 7 | #define LAST(node) ((node)->last) |
@@ -8,3 +9,8 @@ | |||
8 | INTERVAL_TREE_DEFINE(struct interval_tree_node, rb, | 9 | INTERVAL_TREE_DEFINE(struct interval_tree_node, rb, |
9 | unsigned long, __subtree_last, | 10 | unsigned long, __subtree_last, |
10 | START, LAST,, interval_tree) | 11 | START, LAST,, interval_tree) |
12 | |||
13 | EXPORT_SYMBOL_GPL(interval_tree_insert); | ||
14 | EXPORT_SYMBOL_GPL(interval_tree_remove); | ||
15 | EXPORT_SYMBOL_GPL(interval_tree_iter_first); | ||
16 | EXPORT_SYMBOL_GPL(interval_tree_iter_next); | ||
diff --git a/lib/interval_tree_test_main.c b/lib/interval_tree_test.c index 245900b98c8e..245900b98c8e 100644 --- a/lib/interval_tree_test_main.c +++ b/lib/interval_tree_test.c | |||