Messages in this thread | | | From | Namhyung Kim <> | Date | Mon, 14 Sep 2020 15:25:39 +0900 | Subject | Re: [PATCH 09/26] perf tools: Try load vmlinux from buildid database |
| |
On Mon, Sep 14, 2020 at 6:04 AM Jiri Olsa <jolsa@kernel.org> wrote: > > 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.
But dso__load_vmlinux_path() already has the logic. Also you should check symbol_conf.ignore_vmlinux_buildid.
Thanks Namhyung
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > --- > tools/perf/util/build-id.c | 13 ++++++++++--- > tools/perf/util/build-id.h | 2 ++ > tools/perf/util/symbol.c | 14 ++++++++++++++ > 3 files changed, 26 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c > index ecdc167aa1a0..6165f9d1d941 100644 > --- a/tools/perf/util/build-id.c > +++ b/tools/perf/util/build-id.c > @@ -259,10 +259,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; > @@ -291,6 +290,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) \ > diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h > index 1ceede45c231..2cf87b7304e2 100644 > --- a/tools/perf/util/build-id.h > +++ b/tools/perf/util/build-id.h > @@ -23,6 +23,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, > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c > index 5ddf76fb691c..7e1aac4931e1 100644 > --- a/tools/perf/util/symbol.c > +++ b/tools/perf/util/symbol.c > @@ -2183,6 +2183,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; > + > /* > * 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. > @@ -2207,6 +2209,18 @@ 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 under .debug tree. > + */ > + 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) > -- > 2.26.2 >
| |