Skip to content

Commit

Permalink
bpf: Add name to struct bpf_ksym
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jiri Olsa authored and Alexei Starovoitov committed Mar 13, 2020
1 parent 535911c commit bfea9a8
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 14 deletions.
2 changes: 2 additions & 0 deletions include/linux/bpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 0 additions & 6 deletions include/linux/filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

Expand Down Expand Up @@ -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);
Expand Down
9 changes: 6 additions & 3 deletions kernel/bpf/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
9 changes: 4 additions & 5 deletions kernel/events/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
Expand Down

0 comments on commit bfea9a8

Please sign in to comment.