Commit bfea9a85 authored by Jiri Olsa's avatar Jiri Olsa Committed by Alexei Starovoitov

bpf: Add name to struct bpf_ksym

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: default avatarJiri Olsa <jolsa@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Acked-by: default avatarSong Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20200312195610.346362-5-jolsa@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 535911c8
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/refcount.h> #include <linux/refcount.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kallsyms.h>
struct bpf_verifier_env; struct bpf_verifier_env;
struct bpf_verifier_log; struct bpf_verifier_log;
...@@ -474,6 +475,7 @@ void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start); ...@@ -474,6 +475,7 @@ void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start);
struct bpf_ksym { struct bpf_ksym {
unsigned long start; unsigned long start;
unsigned long end; unsigned long end;
char name[KSYM_NAME_LEN];
}; };
enum bpf_tramp_prog_type { enum bpf_tramp_prog_type {
......
...@@ -1083,7 +1083,6 @@ bpf_address_lookup(unsigned long addr, unsigned long *size, ...@@ -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_add(struct bpf_prog *fp);
void bpf_prog_kallsyms_del(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 */ #else /* CONFIG_BPF_JIT */
...@@ -1152,11 +1151,6 @@ static inline void bpf_prog_kallsyms_del(struct bpf_prog *fp) ...@@ -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 */ #endif /* CONFIG_BPF_JIT */
void bpf_prog_kallsyms_del_all(struct bpf_prog *fp); void bpf_prog_kallsyms_del_all(struct bpf_prog *fp);
......
...@@ -535,8 +535,10 @@ bpf_prog_ksym_set_addr(struct bpf_prog *prog) ...@@ -535,8 +535,10 @@ bpf_prog_ksym_set_addr(struct bpf_prog *prog)
prog->aux->ksym.end = addr + hdr->pages * PAGE_SIZE; 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 char *end = sym + KSYM_NAME_LEN;
const struct btf_type *type; const struct btf_type *type;
const char *func_name; const char *func_name;
...@@ -643,6 +645,7 @@ void bpf_prog_kallsyms_add(struct bpf_prog *fp) ...@@ -643,6 +645,7 @@ void bpf_prog_kallsyms_add(struct bpf_prog *fp)
return; return;
bpf_prog_ksym_set_addr(fp); bpf_prog_ksym_set_addr(fp);
bpf_prog_ksym_set_name(fp);
spin_lock_bh(&bpf_lock); spin_lock_bh(&bpf_lock);
bpf_prog_ksym_node_add(fp->aux); bpf_prog_ksym_node_add(fp->aux);
...@@ -681,7 +684,7 @@ const char *__bpf_address_lookup(unsigned long addr, unsigned long *size, ...@@ -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_start = prog->aux->ksym.start;
unsigned long symbol_end = prog->aux->ksym.end; 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; ret = sym;
if (size) if (size)
...@@ -738,7 +741,7 @@ int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type, ...@@ -738,7 +741,7 @@ int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
if (it++ != symnum) if (it++ != symnum)
continue; continue;
bpf_get_prog_name(aux->prog, sym); strncpy(sym, aux->ksym.name, KSYM_NAME_LEN);
*value = (unsigned long)aux->prog->bpf_func; *value = (unsigned long)aux->prog->bpf_func;
*type = BPF_SYM_ELF_TYPE; *type = BPF_SYM_ELF_TYPE;
......
...@@ -8255,23 +8255,22 @@ static void perf_event_bpf_emit_ksymbols(struct bpf_prog *prog, ...@@ -8255,23 +8255,22 @@ static void perf_event_bpf_emit_ksymbols(struct bpf_prog *prog,
enum perf_bpf_event_type type) enum perf_bpf_event_type type)
{ {
bool unregister = type == PERF_BPF_EVENT_PROG_UNLOAD; bool unregister = type == PERF_BPF_EVENT_PROG_UNLOAD;
char sym[KSYM_NAME_LEN];
int i; int i;
if (prog->aux->func_cnt == 0) { if (prog->aux->func_cnt == 0) {
bpf_get_prog_name(prog, sym);
perf_event_ksymbol(PERF_RECORD_KSYMBOL_TYPE_BPF, perf_event_ksymbol(PERF_RECORD_KSYMBOL_TYPE_BPF,
(u64)(unsigned long)prog->bpf_func, (u64)(unsigned long)prog->bpf_func,
prog->jited_len, unregister, sym); prog->jited_len, unregister,
prog->aux->ksym.name);
} else { } else {
for (i = 0; i < prog->aux->func_cnt; i++) { for (i = 0; i < prog->aux->func_cnt; i++) {
struct bpf_prog *subprog = prog->aux->func[i]; struct bpf_prog *subprog = prog->aux->func[i];
bpf_get_prog_name(subprog, sym);
perf_event_ksymbol( perf_event_ksymbol(
PERF_RECORD_KSYMBOL_TYPE_BPF, PERF_RECORD_KSYMBOL_TYPE_BPF,
(u64)(unsigned long)subprog->bpf_func, (u64)(unsigned long)subprog->bpf_func,
subprog->jited_len, unregister, sym); subprog->jited_len, unregister,
prog->aux->ksym.name);
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment