mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 05:04:09 +08:00
rbtree, uprobes: Use rbtree helpers
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>
This commit is contained in:
parent
a3b8986455
commit
a905e84e64
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user