perf annotate: Add basic support for bpf_image
authorJiri Olsa <jolsa@kernel.org>
Thu, 12 Mar 2020 19:56:10 +0000 (20:56 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 16 Apr 2020 15:19:06 +0000 (12:19 -0300)
Add the DSO_BINARY_TYPE__BPF_IMAGE dso binary type to recognize BPF
images that carry trampoline or dispatcher.

Upcoming patches will add support to read the image data, store it
within the BPF feature in perf.data and display it for annotation
purposes.

Currently we only display following message:

  # ./perf annotate bpf_trampoline_24456 --stdio
   Percent |      Source code & Disassembly of . for cycles (504  ...
  --------------------------------------------------------------- ...
           :       to be implemented

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Song Liu <songliubraving@fb.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andrii Nakryiko <andriin@fb.com>
Cc: Björn Töpel <bjorn.topel@intel.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David S. Miller <davem@redhat.com>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Jesper Dangaard Brouer <hawk@kernel.org>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: Martin KaFai Lau <kafai@fb.com>
Cc: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20200312195610.346362-16-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/annotate.c
tools/perf/util/dso.c
tools/perf/util/dso.h
tools/perf/util/machine.c
tools/perf/util/symbol.c

index f1ea0d61eb5b2a33b184f64063ed38be8ede8e98..9760d58e979ac8348f8e7cd330c9b92e1c6d18f3 100644 (file)
@@ -1821,6 +1821,24 @@ static int symbol__disassemble_bpf(struct symbol *sym __maybe_unused,
 }
 #endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
 
+static int
+symbol__disassemble_bpf_image(struct symbol *sym,
+                             struct annotate_args *args)
+{
+       struct annotation *notes = symbol__annotation(sym);
+       struct disasm_line *dl;
+
+       args->offset = -1;
+       args->line = strdup("to be implemented");
+       args->line_nr = 0;
+       dl = disasm_line__new(args);
+       if (dl)
+               annotation_line__add(&dl->al, &notes->src->source);
+
+       free(args->line);
+       return 0;
+}
+
 /*
  * Possibly create a new version of line with tabs expanded. Returns the
  * existing or new line, storage is updated if a new line is allocated. If
@@ -1920,6 +1938,8 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
 
        if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) {
                return symbol__disassemble_bpf(sym, args);
+       } else if (dso->binary_type == DSO_BINARY_TYPE__BPF_IMAGE) {
+               return symbol__disassemble_bpf_image(sym, args);
        } else if (dso__is_kcore(dso)) {
                kce.kcore_filename = symfs_filename;
                kce.addr = map__rip_2objdump(map, sym->start);
index 91f21239608bdff57e1f65644e0e326bbe14b369..f338990e0fe65f4bd1ec4acf2896933747dedb09 100644 (file)
@@ -191,6 +191,7 @@ int dso__read_binary_type_filename(const struct dso *dso,
        case DSO_BINARY_TYPE__GUEST_KALLSYMS:
        case DSO_BINARY_TYPE__JAVA_JIT:
        case DSO_BINARY_TYPE__BPF_PROG_INFO:
+       case DSO_BINARY_TYPE__BPF_IMAGE:
        case DSO_BINARY_TYPE__NOT_FOUND:
                ret = -1;
                break;
index 2db64b79617aea0bc45078fca25cac644728e20a..9553a1fd9e8a834012d8acad87ef626c0df8ffa6 100644 (file)
@@ -40,6 +40,7 @@ enum dso_binary_type {
        DSO_BINARY_TYPE__GUEST_KCORE,
        DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
        DSO_BINARY_TYPE__BPF_PROG_INFO,
+       DSO_BINARY_TYPE__BPF_IMAGE,
        DSO_BINARY_TYPE__NOT_FOUND,
 };
 
index 06aa4e4db63deefc27d79ec8ee519b364934b15c..09845eae9c035f65ef796a619b94e4f938aaf6cb 100644 (file)
@@ -736,6 +736,12 @@ int machine__process_switch_event(struct machine *machine __maybe_unused,
        return 0;
 }
 
+static int is_bpf_image(const char *name)
+{
+       return strncmp(name, "bpf_trampoline_", sizeof("bpf_trampoline_") - 1) ||
+              strncmp(name, "bpf_dispatcher_", sizeof("bpf_dispatcher_") - 1);
+}
+
 static int machine__process_ksymbol_register(struct machine *machine,
                                             union perf_event *event,
                                             struct perf_sample *sample __maybe_unused)
@@ -760,6 +766,11 @@ static int machine__process_ksymbol_register(struct machine *machine,
                map->end = map->start + event->ksymbol.len;
                maps__insert(&machine->kmaps, map);
                dso__set_loaded(dso);
+
+               if (is_bpf_image(event->ksymbol.name)) {
+                       dso->binary_type = DSO_BINARY_TYPE__BPF_IMAGE;
+                       dso__set_long_name(dso, "", false);
+               }
        }
 
        sym = symbol__new(map->map_ip(map, map->start),
index 26bc6a0096ce568bd4e9e70fa910063f1633787b..8f4300492dc7423db4b03888fcd5409570c568d4 100644 (file)
@@ -1544,6 +1544,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod,
                return true;
 
        case DSO_BINARY_TYPE__BPF_PROG_INFO:
+       case DSO_BINARY_TYPE__BPF_IMAGE:
        case DSO_BINARY_TYPE__NOT_FOUND:
        default:
                return false;