mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![Davidlohr Bueso](/assets/img/avatar_default.png)
Allow interval trees to quickly check for overlaps to avoid unnecesary tree lookups in interval_tree_iter_first(). As of this patch, all interval tree flavors will require using a 'rb_root_cached' such that we can have the leftmost node easily available. While most users will make use of this feature, those with special functions (in addition to the generic insert, delete, search calls) will avoid using the cached option as they can do funky things with insertions -- for example, vma_interval_tree_insert_after(). [jglisse@redhat.com: fix deadlock from typo vm_lock_anon_vma()] Link: http://lkml.kernel.org/r/20170808225719.20723-1-jglisse@redhat.com Link: http://lkml.kernel.org/r/20170719014603.19029-12-dave@stgolabs.net Signed-off-by: Davidlohr Bueso <dbueso@suse.de> Signed-off-by: Jérôme Glisse <jglisse@redhat.com> Acked-by: Christian König <christian.koenig@amd.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Doug Ledford <dledford@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Cc: David Airlie <airlied@linux.ie> Cc: Jason Wang <jasowang@redhat.com> Cc: Christian Benvenuti <benve@cisco.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
29 lines
792 B
C
29 lines
792 B
C
#ifndef _LINUX_INTERVAL_TREE_H
|
|
#define _LINUX_INTERVAL_TREE_H
|
|
|
|
#include <linux/rbtree.h>
|
|
|
|
struct interval_tree_node {
|
|
struct rb_node rb;
|
|
unsigned long start; /* Start of interval */
|
|
unsigned long last; /* Last location _in_ interval */
|
|
unsigned long __subtree_last;
|
|
};
|
|
|
|
extern void
|
|
interval_tree_insert(struct interval_tree_node *node,
|
|
struct rb_root_cached *root);
|
|
|
|
extern void
|
|
interval_tree_remove(struct interval_tree_node *node,
|
|
struct rb_root_cached *root);
|
|
|
|
extern struct interval_tree_node *
|
|
interval_tree_iter_first(struct rb_root_cached *root,
|
|
unsigned long start, unsigned long last);
|
|
|
|
extern struct interval_tree_node *
|
|
interval_tree_iter_next(struct interval_tree_node *node,
|
|
unsigned long start, unsigned long last);
|
|
|
|
#endif /* _LINUX_INTERVAL_TREE_H */
|