diff options
Diffstat (limited to 'include/linux/rbtree.h')
| -rw-r--r-- | include/linux/rbtree.h | 21 |
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 | */ | ||
| 57 | struct 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 *); | |||
| 69 | extern struct rb_node *rb_first(const struct rb_root *); | 84 | extern struct rb_node *rb_first(const struct rb_root *); |
| 70 | extern struct rb_node *rb_last(const struct rb_root *); | 85 | extern struct rb_node *rb_last(const struct rb_root *); |
| 71 | 86 | ||
| 87 | extern void rb_insert_color_cached(struct rb_node *, | ||
| 88 | struct rb_root_cached *, bool); | ||
| 89 | extern 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 */ |
| 73 | extern struct rb_node *rb_first_postorder(const struct rb_root *); | 94 | extern struct rb_node *rb_first_postorder(const struct rb_root *); |
| 74 | extern struct rb_node *rb_next_postorder(const struct rb_node *); | 95 | extern struct rb_node *rb_next_postorder(const struct rb_node *); |
