rbtree, uprobes: Use rbtree helpers
authorPeter Zijlstra <peterz@infradead.org>
Wed, 29 Apr 2020 15:06:27 +0000 (17:06 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 17 Feb 2021 13:07:52 +0000 (14:07 +0100)
Reduce rbtree boilerplate by using the new helpers.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Davidlohr Bueso <dbueso@suse.de>
kernel/events/uprobes.c

index bf9edd8..fd5160d 100644 (file)
@@ -613,41 +613,56 @@ static void put_uprobe(struct uprobe *uprobe)
        }
 }
 
-static int match_uprobe(struct uprobe *l, struct uprobe *r)
+static __always_inline
+int uprobe_cmp(const struct inode *l_inode, const loff_t l_offset,
+              const struct uprobe *r)
 {
-       if (l->inode < r->inode)
+       if (l_inode < r->inode)
                return -1;
 
-       if (l->inode > r->inode)
+       if (l_inode > r->inode)
                return 1;
 
-       if (l->offset < r->offset)
+       if (l_offset < r->offset)
                return -1;
 
-       if (l->offset > r->offset)
+       if (l_offset > r->offset)
                return 1;
 
        return 0;
 }
 
+#define __node_2_uprobe(node) \
+       rb_entry((node), struct uprobe, rb_node)
+
+struct __uprobe_key {
+       struct inode *inode;
+       loff_t offset;
+};
+
+static inline int __uprobe_cmp_key(const void *key, const struct rb_node *b)
+{
+       const struct __uprobe_key *a = key;
+       return uprobe_cmp(a->inode, a->offset, __node_2_uprobe(b));
+}
+
+static inline int __uprobe_cmp(struct rb_node *a, const struct rb_node *b)
+{
+       struct uprobe *u = __node_2_uprobe(a);
+       return uprobe_cmp(u->inode, u->offset, __node_2_uprobe(b));
+}
+
 static struct uprobe *__find_uprobe(struct inode *inode, loff_t offset)
 {
-       struct uprobe u = { .inode = inode, .offset = offset };
-       struct rb_node *n = uprobes_tree.rb_node;
-       struct uprobe *uprobe;
-       int match;
+       struct __uprobe_key key = {
+               .inode = inode,
+               .offset = offset,
+       };
+       struct rb_node *node = rb_find(&key, &uprobes_tree, __uprobe_cmp_key);
 
-       while (n) {
-               uprobe = rb_entry(n, struct uprobe, rb_node);
-               match = match_uprobe(&u, uprobe);
-               if (!match)
-                       return get_uprobe(uprobe);
+       if (node)
+               return __node_2_uprobe(node);
 
-               if (match < 0)
-                       n = n->rb_left;
-               else
-                       n = n->rb_right;
-       }
        return NULL;
 }
 
@@ -668,32 +683,15 @@ static struct uprobe *find_uprobe(struct inode *inode, loff_t offset)
 
 static struct uprobe *__insert_uprobe(struct uprobe *uprobe)
 {
-       struct rb_node **p = &uprobes_tree.rb_node;
-       struct rb_node *parent = NULL;
-       struct uprobe *u;
-       int match;
+       struct rb_node *node;
 
-       while (*p) {
-               parent = *p;
-               u = rb_entry(parent, struct uprobe, rb_node);
-               match = match_uprobe(uprobe, u);
-               if (!match)
-                       return get_uprobe(u);
+       node = rb_find_add(&uprobe->rb_node, &uprobes_tree, __uprobe_cmp);
+       if (node)
+               return get_uprobe(__node_2_uprobe(node));
 
-               if (match < 0)
-                       p = &parent->rb_left;
-               else
-                       p = &parent->rb_right;
-
-       }
-
-       u = NULL;
-       rb_link_node(&uprobe->rb_node, parent, p);
-       rb_insert_color(&uprobe->rb_node, &uprobes_tree);
        /* get access + creation ref */
        refcount_set(&uprobe->ref, 2);
-
-       return u;
+       return NULL;
 }
 
 /*