Re: [PATCH 06/14] bpf: Add bpf_kallsyms_tree tree
From: Jiri Olsa <hidden>
Date: 2020-02-12 10:49:50
Also in:
bpf
On Tue, Feb 11, 2020 at 10:21:10AM -0800, Andrii Nakryiko wrote:
On Sat, Feb 8, 2020 at 7:43 AM Jiri Olsa [off-list ref] wrote:quoted
The bpf_tree is used both for kallsyms iterations and searching for exception tables of bpf programs, which is needed only for bpf programs. Adding bpf_kallsyms_tree that will hold symbols for all bpf_prog, bpf_trampoline and bpf_dispatcher objects and keeping bpf_tree only for bpf_prog objects exception tables search to keep it fast. Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- include/linux/bpf.h | 1 + kernel/bpf/core.c | 60 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 6 deletions(-)diff --git a/include/linux/bpf.h b/include/linux/bpf.h index da67ca3afa2f..151d7b1c8435 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h@@ -468,6 +468,7 @@ struct bpf_ksym { unsigned long end; char name[KSYM_NAME_LEN]; struct list_head lnode; + struct latch_tree_node tnode; }; enum bpf_tramp_prog_type {diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index b9b7077e60f3..1daa72341450 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c@@ -606,8 +606,46 @@ static const struct latch_tree_ops bpf_tree_ops = { .comp = bpf_tree_comp, }; +static __always_inline unsigned long +bpf_get_ksym_start(struct latch_tree_node *n)I thought static functions are never marked as inline in kernel sources. Are there some special cases when its ok/necessary?
I followed the other latch tree ops functions and did not think much about that.. will check
quoted
+{ + const struct bpf_ksym *ksym; + + ksym = container_of(n, struct bpf_ksym, tnode); + return ksym->start; +} + +static __always_inline bool +bpf_ksym_tree_less(struct latch_tree_node *a, + struct latch_tree_node *b) +{ + return bpf_get_ksym_start(a) < bpf_get_ksym_start(b); +} + +static __always_inline int +bpf_ksym_tree_comp(void *key, struct latch_tree_node *n) +{ + unsigned long val = (unsigned long)key; + const struct bpf_ksym *ksym; + + ksym = container_of(n, struct bpf_ksym, tnode); + + if (val < ksym->start) + return -1; + if (val >= ksym->end) + return 1; + + return 0; +} + +static const struct latch_tree_ops bpf_kallsyms_tree_ops = {Given all the helper functions use bpf_ksym_tree and bpf_ksym (bpf_ksym_find) prefixes, call this bpf_ksym_tree_ops?
right, should be bpf_ksym_tree_ops as you said
quoted
+ .less = bpf_ksym_tree_less, + .comp = bpf_ksym_tree_comp, +}; + static DEFINE_SPINLOCK(bpf_lock); static LIST_HEAD(bpf_kallsyms); +static struct latch_tree_root bpf_kallsyms_tree __cacheline_aligned;same as above, bpf_ksym_tree for consistency?
right, thanks jirka