]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
bpf: Add name to struct bpf_ksym
authorJiri Olsa <jolsa@kernel.org>
Thu, 12 Mar 2020 19:55:59 +0000 (20:55 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 13 Mar 2020 19:49:51 +0000 (12:49 -0700)
Adding name to 'struct bpf_ksym' object to carry the name
of the symbol for bpf_prog, bpf_trampoline, bpf_dispatcher
objects.

The current benefit is that name is now generated only when
the symbol is added to the list, so we don't need to generate
it every time it's accessed.

The future benefit is that we will have all the bpf objects
symbols represented by struct bpf_ksym.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20200312195610.346362-5-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf.h
include/linux/filter.h
kernel/bpf/core.c
kernel/events/core.c

index 6ca3d5c8ccf3dbe8b1723311d7a6e5f6cb3aca54..047b44deb3c5a4c6d34502848a118e615a733f20 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/refcount.h>
 #include <linux/mutex.h>
 #include <linux/module.h>
+#include <linux/kallsyms.h>
 
 struct bpf_verifier_env;
 struct bpf_verifier_log;
@@ -474,6 +475,7 @@ void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start);
 struct bpf_ksym {
        unsigned long            start;
        unsigned long            end;
+       char                     name[KSYM_NAME_LEN];
 };
 
 enum bpf_tramp_prog_type {
index 6249679275b39b9cd67b1135addd521582d1f4c8..9b5aa5c483ccb59be7ea7be2fe856b2995c64344 100644 (file)
@@ -1083,7 +1083,6 @@ bpf_address_lookup(unsigned long addr, unsigned long *size,
 
 void bpf_prog_kallsyms_add(struct bpf_prog *fp);
 void bpf_prog_kallsyms_del(struct bpf_prog *fp);
-void bpf_get_prog_name(const struct bpf_prog *prog, char *sym);
 
 #else /* CONFIG_BPF_JIT */
 
@@ -1152,11 +1151,6 @@ static inline void bpf_prog_kallsyms_del(struct bpf_prog *fp)
 {
 }
 
-static inline void bpf_get_prog_name(const struct bpf_prog *prog, char *sym)
-{
-       sym[0] = '\0';
-}
-
 #endif /* CONFIG_BPF_JIT */
 
 void bpf_prog_kallsyms_del_all(struct bpf_prog *fp);
index e587d6306d7c6001ddfd6c1a48ceb1e184d6ea93..f6800c2d4b01ca2601f37bb06cc4498d7fb264e2 100644 (file)
@@ -535,8 +535,10 @@ bpf_prog_ksym_set_addr(struct bpf_prog *prog)
        prog->aux->ksym.end   = addr + hdr->pages * PAGE_SIZE;
 }
 
-void bpf_get_prog_name(const struct bpf_prog *prog, char *sym)
+static void
+bpf_prog_ksym_set_name(struct bpf_prog *prog)
 {
+       char *sym = prog->aux->ksym.name;
        const char *end = sym + KSYM_NAME_LEN;
        const struct btf_type *type;
        const char *func_name;
@@ -643,6 +645,7 @@ void bpf_prog_kallsyms_add(struct bpf_prog *fp)
                return;
 
        bpf_prog_ksym_set_addr(fp);
+       bpf_prog_ksym_set_name(fp);
 
        spin_lock_bh(&bpf_lock);
        bpf_prog_ksym_node_add(fp->aux);
@@ -681,7 +684,7 @@ const char *__bpf_address_lookup(unsigned long addr, unsigned long *size,
                unsigned long symbol_start = prog->aux->ksym.start;
                unsigned long symbol_end = prog->aux->ksym.end;
 
-               bpf_get_prog_name(prog, sym);
+               strncpy(sym, prog->aux->ksym.name, KSYM_NAME_LEN);
 
                ret = sym;
                if (size)
@@ -738,7 +741,7 @@ int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
                if (it++ != symnum)
                        continue;
 
-               bpf_get_prog_name(aux->prog, sym);
+               strncpy(sym, aux->ksym.name, KSYM_NAME_LEN);
 
                *value = (unsigned long)aux->prog->bpf_func;
                *type  = BPF_SYM_ELF_TYPE;
index bbdfac0182f41e6f5c5c1695d715e03909cc3b89..9b89ef17624747cc621ea216ab9dda56d2fba1f9 100644 (file)
@@ -8255,23 +8255,22 @@ static void perf_event_bpf_emit_ksymbols(struct bpf_prog *prog,
                                         enum perf_bpf_event_type type)
 {
        bool unregister = type == PERF_BPF_EVENT_PROG_UNLOAD;
-       char sym[KSYM_NAME_LEN];
        int i;
 
        if (prog->aux->func_cnt == 0) {
-               bpf_get_prog_name(prog, sym);
                perf_event_ksymbol(PERF_RECORD_KSYMBOL_TYPE_BPF,
                                   (u64)(unsigned long)prog->bpf_func,
-                                  prog->jited_len, unregister, sym);
+                                  prog->jited_len, unregister,
+                                  prog->aux->ksym.name);
        } else {
                for (i = 0; i < prog->aux->func_cnt; i++) {
                        struct bpf_prog *subprog = prog->aux->func[i];
 
-                       bpf_get_prog_name(subprog, sym);
                        perf_event_ksymbol(
                                PERF_RECORD_KSYMBOL_TYPE_BPF,
                                (u64)(unsigned long)subprog->bpf_func,
-                               subprog->jited_len, unregister, sym);
+                               subprog->jited_len, unregister,
+                               prog->aux->ksym.name);
                }
        }
 }