Commit fd643afc authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf record: Save DSO build-ID for synthesizing

When synthesizing MMAP2 with build-id, it'd read the same file repeatedly as
it has no idea if it's done already.  Maintain a dsos to check that and skip
the file access if possible.
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220920222822.2171056-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent fa2edc07
...@@ -364,11 +364,14 @@ static bool read_proc_maps_line(struct io *io, __u64 *start, __u64 *end, ...@@ -364,11 +364,14 @@ static bool read_proc_maps_line(struct io *io, __u64 *start, __u64 *end,
} }
static void perf_record_mmap2__read_build_id(struct perf_record_mmap2 *event, static void perf_record_mmap2__read_build_id(struct perf_record_mmap2 *event,
struct machine *machine,
bool is_kernel) bool is_kernel)
{ {
struct build_id bid; struct build_id bid;
struct nsinfo *nsi; struct nsinfo *nsi;
struct nscookie nc; struct nscookie nc;
struct dso *dso = NULL;
struct dso_id id;
int rc; int rc;
if (is_kernel) { if (is_kernel) {
...@@ -376,6 +379,18 @@ static void perf_record_mmap2__read_build_id(struct perf_record_mmap2 *event, ...@@ -376,6 +379,18 @@ static void perf_record_mmap2__read_build_id(struct perf_record_mmap2 *event,
goto out; goto out;
} }
id.maj = event->maj;
id.min = event->min;
id.ino = event->ino;
id.ino_generation = event->ino_generation;
dso = dsos__findnew_id(&machine->dsos, event->filename, &id);
if (dso && dso->has_build_id) {
bid = dso->bid;
rc = 0;
goto out;
}
nsi = nsinfo__new(event->pid); nsi = nsinfo__new(event->pid);
nsinfo__mountns_enter(nsi, &nc); nsinfo__mountns_enter(nsi, &nc);
...@@ -391,12 +406,16 @@ static void perf_record_mmap2__read_build_id(struct perf_record_mmap2 *event, ...@@ -391,12 +406,16 @@ static void perf_record_mmap2__read_build_id(struct perf_record_mmap2 *event,
event->header.misc |= PERF_RECORD_MISC_MMAP_BUILD_ID; event->header.misc |= PERF_RECORD_MISC_MMAP_BUILD_ID;
event->__reserved_1 = 0; event->__reserved_1 = 0;
event->__reserved_2 = 0; event->__reserved_2 = 0;
if (dso && !dso->has_build_id)
dso__set_build_id(dso, &bid);
} else { } else {
if (event->filename[0] == '/') { if (event->filename[0] == '/') {
pr_debug2("Failed to read build ID for %s\n", pr_debug2("Failed to read build ID for %s\n",
event->filename); event->filename);
} }
} }
dso__put(dso);
} }
int perf_event__synthesize_mmap_events(struct perf_tool *tool, int perf_event__synthesize_mmap_events(struct perf_tool *tool,
...@@ -507,7 +526,7 @@ int perf_event__synthesize_mmap_events(struct perf_tool *tool, ...@@ -507,7 +526,7 @@ int perf_event__synthesize_mmap_events(struct perf_tool *tool,
event->mmap2.tid = pid; event->mmap2.tid = pid;
if (symbol_conf.buildid_mmap2) if (symbol_conf.buildid_mmap2)
perf_record_mmap2__read_build_id(&event->mmap2, false); perf_record_mmap2__read_build_id(&event->mmap2, machine, false);
if (perf_tool__process_synth_event(tool, event, machine, process) != 0) { if (perf_tool__process_synth_event(tool, event, machine, process) != 0) {
rc = -1; rc = -1;
...@@ -690,7 +709,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__handler_t ...@@ -690,7 +709,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__handler_t
memcpy(event->mmap2.filename, pos->dso->long_name, memcpy(event->mmap2.filename, pos->dso->long_name,
pos->dso->long_name_len + 1); pos->dso->long_name_len + 1);
perf_record_mmap2__read_build_id(&event->mmap2, false); perf_record_mmap2__read_build_id(&event->mmap2, machine, false);
} else { } else {
size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64)); size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
event->mmap.header.type = PERF_RECORD_MMAP; event->mmap.header.type = PERF_RECORD_MMAP;
...@@ -1126,7 +1145,7 @@ static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool, ...@@ -1126,7 +1145,7 @@ static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
event->mmap2.len = map->end - event->mmap.start; event->mmap2.len = map->end - event->mmap.start;
event->mmap2.pid = machine->pid; event->mmap2.pid = machine->pid;
perf_record_mmap2__read_build_id(&event->mmap2, true); perf_record_mmap2__read_build_id(&event->mmap2, machine, true);
} else { } else {
size = snprintf(event->mmap.filename, sizeof(event->mmap.filename), size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
"%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1; "%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment