mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
perf bpf: Show more BPF program info in print_bpf_prog_info()
This patch enables showing bpf program name, address, and size in the header. Before the patch: perf report --header-only ... # bpf_prog_info of id 9 # bpf_prog_info of id 10 # bpf_prog_info of id 13 After the patch: # bpf_prog_info 9: bpf_prog_7be49e3934a125ba addr 0xffffffffa0024947 size 229 # bpf_prog_info 10: bpf_prog_2a142ef67aaad174 addr 0xffffffffa007c94d size 229 # bpf_prog_info 13: bpf_prog_47368425825d7384_task__task_newt addr 0xffffffffa0251137 size 369 Committer notes: Fix the fallback definition when HAVE_LIBBPF_SUPPORT is not defined, i.e. add the missing 'static inline' and add the __maybe_unused to the args. Also add stdio.h since we now use FILE * in bpf-event.h. Signed-off-by: Song Liu <songliubraving@fb.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stanislav Fomichev <sdf@google.com> Link: http://lkml.kernel.org/r/20190319165454.1298742-3-songliubraving@fb.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
fc462ac75b
commit
f8dfeae009
@ -438,3 +438,43 @@ int bpf_event__add_sb_event(struct perf_evlist **evlist,
|
|||||||
|
|
||||||
return perf_evlist__add_sb_event(evlist, &attr, bpf_event__sb_cb, env);
|
return perf_evlist__add_sb_event(evlist, &attr, bpf_event__sb_cb, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info,
|
||||||
|
struct perf_env *env,
|
||||||
|
FILE *fp)
|
||||||
|
{
|
||||||
|
__u32 *prog_lens = (__u32 *)(uintptr_t)(info->jited_func_lens);
|
||||||
|
__u64 *prog_addrs = (__u64 *)(uintptr_t)(info->jited_ksyms);
|
||||||
|
char name[KSYM_NAME_LEN];
|
||||||
|
struct btf *btf = NULL;
|
||||||
|
u32 sub_prog_cnt, i;
|
||||||
|
|
||||||
|
sub_prog_cnt = info->nr_jited_ksyms;
|
||||||
|
if (sub_prog_cnt != info->nr_prog_tags ||
|
||||||
|
sub_prog_cnt != info->nr_jited_func_lens)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (info->btf_id) {
|
||||||
|
struct btf_node *node;
|
||||||
|
|
||||||
|
node = perf_env__find_btf(env, info->btf_id);
|
||||||
|
if (node)
|
||||||
|
btf = btf__new((__u8 *)(node->data),
|
||||||
|
node->data_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sub_prog_cnt == 1) {
|
||||||
|
synthesize_bpf_prog_name(name, KSYM_NAME_LEN, info, btf, 0);
|
||||||
|
fprintf(fp, "# bpf_prog_info %u: %s addr 0x%llx size %u\n",
|
||||||
|
info->id, name, prog_addrs[0], prog_lens[0]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fp, "# bpf_prog_info %u:\n", info->id);
|
||||||
|
for (i = 0; i < sub_prog_cnt; i++) {
|
||||||
|
synthesize_bpf_prog_name(name, KSYM_NAME_LEN, info, btf, i);
|
||||||
|
|
||||||
|
fprintf(fp, "# \tsub_prog %u: %s addr 0x%llx size %u\n",
|
||||||
|
i, name, prog_addrs[i], prog_lens[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <api/fd/array.h>
|
#include <api/fd/array.h>
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
struct machine;
|
struct machine;
|
||||||
union perf_event;
|
union perf_event;
|
||||||
@ -38,7 +39,9 @@ int perf_event__synthesize_bpf_events(struct perf_session *session,
|
|||||||
struct record_opts *opts);
|
struct record_opts *opts);
|
||||||
int bpf_event__add_sb_event(struct perf_evlist **evlist,
|
int bpf_event__add_sb_event(struct perf_evlist **evlist,
|
||||||
struct perf_env *env);
|
struct perf_env *env);
|
||||||
|
void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info,
|
||||||
|
struct perf_env *env,
|
||||||
|
FILE *fp);
|
||||||
#else
|
#else
|
||||||
static inline int machine__process_bpf_event(struct machine *machine __maybe_unused,
|
static inline int machine__process_bpf_event(struct machine *machine __maybe_unused,
|
||||||
union perf_event *event __maybe_unused,
|
union perf_event *event __maybe_unused,
|
||||||
@ -61,5 +64,11 @@ static inline int bpf_event__add_sb_event(struct perf_evlist **evlist __maybe_un
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info __maybe_unused,
|
||||||
|
struct perf_env *env __maybe_unused,
|
||||||
|
FILE *fp __maybe_unused)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
#endif // HAVE_LIBBPF_SUPPORT
|
#endif // HAVE_LIBBPF_SUPPORT
|
||||||
#endif
|
#endif
|
||||||
|
@ -1468,8 +1468,9 @@ static void print_bpf_prog_info(struct feat_fd *ff, FILE *fp)
|
|||||||
|
|
||||||
node = rb_entry(next, struct bpf_prog_info_node, rb_node);
|
node = rb_entry(next, struct bpf_prog_info_node, rb_node);
|
||||||
next = rb_next(&node->rb_node);
|
next = rb_next(&node->rb_node);
|
||||||
fprintf(fp, "# bpf_prog_info of id %u\n",
|
|
||||||
node->info_linear->info.id);
|
bpf_event__print_bpf_prog_info(&node->info_linear->info,
|
||||||
|
env, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
up_read(&env->bpf_progs.lock);
|
up_read(&env->bpf_progs.lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user