]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
perf symbols: Try to load vmlinux from buildid database
authorJiri Olsa <jolsa@kernel.org>
Thu, 26 Nov 2020 17:00:13 +0000 (18:00 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 27 Nov 2020 11:37:08 +0000 (08:37 -0300)
Currently we don't check on kernel's vmlinux the same way as we do for
normal binaries, but we either look for kallsyms file in build id
database or check on known vmlinux locations (plus some other optional
paths).

This patch adds the check for standard build id binary location, so we
are ready once we start to store it there from debuginfod in following
changes.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20201126170026.2619053-13-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/build-id.c
tools/perf/util/build-id.h
tools/perf/util/symbol.c

index 4a391f13f40d0cf3364da27d343df7ec962cb305..1fd58703c2d490c39bfeade519b2ae9a02e286b3 100644 (file)
@@ -261,10 +261,9 @@ static const char *build_id_cache__basename(bool is_kallsyms, bool is_vdso,
            "debug" : "elf"));
 }
 
-char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
-                            bool is_debug)
+char *__dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
+                              bool is_debug, bool is_kallsyms)
 {
-       bool is_kallsyms = dso__is_kallsyms((struct dso *)dso);
        bool is_vdso = dso__is_vdso((struct dso *)dso);
        char sbuild_id[SBUILD_ID_SIZE];
        char *linkname;
@@ -293,6 +292,14 @@ char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
        return bf;
 }
 
+char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
+                            bool is_debug)
+{
+       bool is_kallsyms = dso__is_kallsyms((struct dso *)dso);
+
+       return __dso__build_id_filename(dso, bf, size, is_debug, is_kallsyms);
+}
+
 #define dsos__for_each_with_build_id(pos, head)        \
        list_for_each_entry(pos, head, node)    \
                if (!pos->has_build_id)         \
index d53415feaf69a898d65d4707257068519937f9bb..f1a2f67df6e48b8b95c6235be01e1f7b18f522a2 100644 (file)
@@ -29,6 +29,8 @@ char *build_id_cache__kallsyms_path(const char *sbuild_id, char *bf,
 
 char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
                             bool is_debug);
+char *__dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
+                              bool is_debug, bool is_kallsyms);
 
 int build_id__mark_dso_hit(struct perf_tool *tool, union perf_event *event,
                           struct perf_sample *sample, struct evsel *evsel,
index 0d14abdf3d722f63031af608978891139d76e226..64a039cbba1b5d055edc6d5440ce1064f2f1d366 100644 (file)
@@ -2189,6 +2189,8 @@ static int dso__load_kernel_sym(struct dso *dso, struct map *map)
        int err;
        const char *kallsyms_filename = NULL;
        char *kallsyms_allocated_filename = NULL;
+       char *filename = NULL;
+
        /*
         * Step 1: if the user specified a kallsyms or vmlinux filename, use
         * it and only it, reporting errors to the user if it cannot be used.
@@ -2213,6 +2215,20 @@ static int dso__load_kernel_sym(struct dso *dso, struct map *map)
                return dso__load_vmlinux(dso, map, symbol_conf.vmlinux_name, false);
        }
 
+       /*
+        * Before checking on common vmlinux locations, check if it's
+        * stored as standard build id binary (not kallsyms) under
+        * .debug cache.
+        */
+       if (!symbol_conf.ignore_vmlinux_buildid)
+               filename = __dso__build_id_filename(dso, NULL, 0, false, false);
+       if (filename != NULL) {
+               err = dso__load_vmlinux(dso, map, filename, true);
+               if (err > 0)
+                       return err;
+               free(filename);
+       }
+
        if (!symbol_conf.ignore_vmlinux && vmlinux_path != NULL) {
                err = dso__load_vmlinux_path(dso, map);
                if (err > 0)