aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/rbtree.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/rbtree.h')
-rw-r--r--include/linux/rbtree.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
index e585018498d5..d574361943ea 100644
--- a/include/linux/rbtree.h
+++ b/include/linux/rbtree.h
@@ -44,10 +44,25 @@ struct rb_root {
44 struct rb_node *rb_node; 44 struct rb_node *rb_node;
45}; 45};
46 46
47/*
48 * Leftmost-cached rbtrees.
49 *
50 * We do not cache the rightmost node based on footprint
51 * size vs number of potential users that could benefit
52 * from O(1) rb_last(). Just not worth it, users that want
53 * this feature can always implement the logic explicitly.
54 * Furthermore, users that want to cache both pointers may
55 * find it a bit asymmetric, but that's ok.
56 */
57struct rb_root_cached {
58 struct rb_root rb_root;
59 struct rb_node *rb_leftmost;
60};
47 61
48#define rb_parent(r) ((struct rb_node *)((r)->__rb_parent_color & ~3)) 62#define rb_parent(r) ((struct rb_node *)((r)->__rb_parent_color & ~3))
49 63
50#define RB_ROOT (struct rb_root) { NULL, } 64#define RB_ROOT (struct rb_root) { NULL, }
65#define RB_ROOT_CACHED (struct rb_root_cached) { {NULL, }, NULL }
51#define rb_entry(ptr, type, member) container_of(ptr, type, member) 66#define rb_entry(ptr, type, member) container_of(ptr, type, member)
52 67
53#define RB_EMPTY_ROOT(root) (READ_ONCE((root)->rb_node) == NULL) 68#define RB_EMPTY_ROOT(root) (READ_ONCE((root)->rb_node) == NULL)
@@ -69,6 +84,12 @@ extern struct rb_node *rb_prev(const struct rb_node *);
69extern struct rb_node *rb_first(const struct rb_root *); 84extern struct rb_node *rb_first(const struct rb_root *);
70extern struct rb_node *rb_last(const struct rb_root *); 85extern struct rb_node *rb_last(const struct rb_root *);
71 86
87extern void rb_insert_color_cached(struct rb_node *,
88 struct rb_root_cached *, bool);
89extern void rb_erase_cached(struct rb_node *node, struct rb_root_cached *);
90/* Same as rb_first(), but O(1) */
91#define rb_first_cached(root) (root)->rb_leftmost
92
72/* Postorder iteration - always visit the parent after its children */ 93/* Postorder iteration - always visit the parent after its children */
73extern struct rb_node *rb_first_postorder(const struct rb_root *); 94extern struct rb_node *rb_first_postorder(const struct rb_root *);
74extern struct rb_node *rb_next_postorder(const struct rb_node *); 95extern struct rb_node *rb_next_postorder(const struct rb_node *);