Skip to content

Commit

Permalink
perf record: Save DSO build-ID for synthesizing
Browse files Browse the repository at this point in the history
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: Namhyung 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.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Namhyung Kim authored and Arnaldo Carvalho de Melo committed Oct 6, 2022
1 parent fa2edc0 commit fd643af
Showing 1 changed file with 22 additions and 3 deletions.
25 changes: 22 additions & 3 deletions tools/perf/util/synthetic-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,18 +364,33 @@ 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,
struct machine *machine,
bool is_kernel)
{
struct build_id bid;
struct nsinfo *nsi;
struct nscookie nc;
struct dso *dso = NULL;
struct dso_id id;
int rc;

if (is_kernel) {
rc = sysfs__read_build_id("/sys/kernel/notes", &bid);
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);
nsinfo__mountns_enter(nsi, &nc);

Expand All @@ -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->__reserved_1 = 0;
event->__reserved_2 = 0;

if (dso && !dso->has_build_id)
dso__set_build_id(dso, &bid);
} else {
if (event->filename[0] == '/') {
pr_debug2("Failed to read build ID for %s\n",
event->filename);
}
}
dso__put(dso);
}

int perf_event__synthesize_mmap_events(struct perf_tool *tool,
Expand Down Expand Up @@ -507,7 +526,7 @@ int perf_event__synthesize_mmap_events(struct perf_tool *tool,
event->mmap2.tid = pid;

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) {
rc = -1;
Expand Down Expand Up @@ -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,
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 {
size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
event->mmap.header.type = PERF_RECORD_MMAP;
Expand Down Expand Up @@ -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.pid = machine->pid;

perf_record_mmap2__read_build_id(&event->mmap2, true);
perf_record_mmap2__read_build_id(&event->mmap2, machine, true);
} else {
size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
"%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1;
Expand Down

0 comments on commit fd643af

Please sign in to comment.