diff options
| author | Stefan Schmidt <stefan@datenfreihafen.org> | 2021-02-24 13:36:58 +0100 |
|---|---|---|
| committer | Stefan Schmidt <stefan@datenfreihafen.org> | 2021-02-24 13:36:58 +0100 |
| commit | cdd38c5f1ce4398ec58fec95904b75824daab7b5 (patch) | |
| tree | 639cf51fe8ee120a13e61b13d448aeaf4d044c74 /lib/timerqueue.c | |
| parent | 04052a318fb93491f1f3b4d282cb806f588e9326 (diff) | |
| parent | fcb3007371e1a4afb03280af1b336a83287fe115 (diff) | |
Merge remote-tracking branch 'net/master'
Diffstat (limited to 'lib/timerqueue.c')
| -rw-r--r-- | lib/timerqueue.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/lib/timerqueue.c b/lib/timerqueue.c index c52710964593..cdb9c7658478 100644 --- a/lib/timerqueue.c +++ b/lib/timerqueue.c @@ -14,6 +14,14 @@ #include <linux/rbtree.h> #include <linux/export.h> +#define __node_2_tq(_n) \ + rb_entry((_n), struct timerqueue_node, node) + +static inline bool __timerqueue_less(struct rb_node *a, const struct rb_node *b) +{ + return __node_2_tq(a)->expires < __node_2_tq(b)->expires; +} + /** * timerqueue_add - Adds timer to timerqueue. * @@ -26,28 +34,10 @@ */ bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node) { - struct rb_node **p = &head->rb_root.rb_root.rb_node; - struct rb_node *parent = NULL; - struct timerqueue_node *ptr; - bool leftmost = true; - /* Make sure we don't add nodes that are already added */ WARN_ON_ONCE(!RB_EMPTY_NODE(&node->node)); - while (*p) { - parent = *p; - ptr = rb_entry(parent, struct timerqueue_node, node); - if (node->expires < ptr->expires) { - p = &(*p)->rb_left; - } else { - p = &(*p)->rb_right; - leftmost = false; - } - } - rb_link_node(&node->node, parent, p); - rb_insert_color_cached(&node->node, &head->rb_root, leftmost); - - return leftmost; + return rb_add_cached(&node->node, &head->rb_root, __timerqueue_less); } EXPORT_SYMBOL_GPL(timerqueue_add); |
