perf map: Add accessors for ->pgoff and ->reloc

Later changes will add reference count checking for 'struct map'. Add
accessors so that the reference count check is only necessary in one
place.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: German Gomez <german.gomez@arm.com>
Cc: Hao Luo <haoluo@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Miaoqian Lin <linmq006@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Shunsuke Nakamura <nakamura.shun@fujitsu.com>
Cc: Song Liu <song@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Yury Norov <yury.norov@gmail.com>
Link: https://lore.kernel.org/r/20230404205954.2245628-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Ian Rogers 2023-04-04 13:59:46 -07:00 committed by Arnaldo Carvalho de Melo
parent ddee3f2bdd
commit 2a6e5e8a2a
9 changed files with 33 additions and 23 deletions

View file

@ -61,7 +61,7 @@ int perf_event__synthesize_extra_kmaps(struct perf_tool *tool,
event->mmap.start = map__start(map); event->mmap.start = map__start(map);
event->mmap.len = map__size(map); event->mmap.len = map__size(map);
event->mmap.pgoff = map->pgoff; event->mmap.pgoff = map__pgoff(map);
event->mmap.pid = machine->pid; event->mmap.pid = machine->pid;
strlcpy(event->mmap.filename, kmap->name, PATH_MAX); strlcpy(event->mmap.filename, kmap->name, PATH_MAX);

View file

@ -857,7 +857,7 @@ static size_t maps__fprintf_task(struct maps *maps, int indent, FILE *fp)
prot & PROT_WRITE ? 'w' : '-', prot & PROT_WRITE ? 'w' : '-',
prot & PROT_EXEC ? 'x' : '-', prot & PROT_EXEC ? 'x' : '-',
map__flags(map) ? 's' : 'p', map__flags(map) ? 's' : 'p',
map->pgoff, map__pgoff(map),
dso->id.ino, dso->name); dso->id.ino, dso->name);
} }

View file

@ -335,10 +335,10 @@ static int test__vmlinux_matches_kallsyms(struct test_suite *test __maybe_unused
} }
pr_info("WARN: %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as", pr_info("WARN: %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as",
map__start(map), map__end(map), map->pgoff, dso->name); map__start(map), map__end(map), map__pgoff(map), dso->name);
if (mem_end != map__end(pair)) if (mem_end != map__end(pair))
pr_info(":\nWARN: *%" PRIx64 "-%" PRIx64 " %" PRIx64, pr_info(":\nWARN: *%" PRIx64 "-%" PRIx64 " %" PRIx64,
map__start(pair), map__end(pair), pair->pgoff); map__start(pair), map__end(pair), map__pgoff(pair));
pr_info(" %s\n", dso->name); pr_info(" %s\n", dso->name);
pair->priv = 1; pair->priv = 1;
} }

View file

@ -1277,9 +1277,9 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine,
if (!kmap || !is_entry_trampoline(kmap->name)) if (!kmap || !is_entry_trampoline(kmap->name))
continue; continue;
dest_map = maps__find(kmaps, map->pgoff); dest_map = maps__find(kmaps, map__pgoff(map));
if (dest_map != map) if (dest_map != map)
map->pgoff = map__map_ip(dest_map, map->pgoff); map->pgoff = map__map_ip(dest_map, map__pgoff(map));
found = true; found = true;
} }
if (found || machine->trampolines_mapped) if (found || machine->trampolines_mapped)

View file

@ -421,7 +421,7 @@ size_t map__fprintf(struct map *map, FILE *fp)
const struct dso *dso = map__dso(map); const struct dso *dso = map__dso(map);
return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n", return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n",
map__start(map), map__end(map), map->pgoff, dso->name); map__start(map), map__end(map), map__pgoff(map), dso->name);
} }
size_t map__fprintf_dsoname(struct map *map, FILE *fp) size_t map__fprintf_dsoname(struct map *map, FILE *fp)
@ -510,7 +510,7 @@ u64 map__rip_2objdump(struct map *map, u64 rip)
return rip; return rip;
if (dso->rel) if (dso->rel)
return rip - map->pgoff; return rip - map__pgoff(map);
/* /*
* kernel modules also have DSO_TYPE_USER in dso->kernel, * kernel modules also have DSO_TYPE_USER in dso->kernel,
@ -519,7 +519,7 @@ u64 map__rip_2objdump(struct map *map, u64 rip)
if (dso->kernel == DSO_SPACE__USER) if (dso->kernel == DSO_SPACE__USER)
return rip + dso->text_offset; return rip + dso->text_offset;
return map__unmap_ip(map, rip) - map->reloc; return map__unmap_ip(map, rip) - map__reloc(map);
} }
/** /**
@ -542,7 +542,7 @@ u64 map__objdump_2mem(struct map *map, u64 ip)
return map__unmap_ip(map, ip); return map__unmap_ip(map, ip);
if (dso->rel) if (dso->rel)
return map__unmap_ip(map, ip + map->pgoff); return map__unmap_ip(map, ip + map__pgoff(map));
/* /*
* kernel modules also have DSO_TYPE_USER in dso->kernel, * kernel modules also have DSO_TYPE_USER in dso->kernel,
@ -551,7 +551,7 @@ u64 map__objdump_2mem(struct map *map, u64 ip)
if (dso->kernel == DSO_SPACE__USER) if (dso->kernel == DSO_SPACE__USER)
return map__unmap_ip(map, ip - dso->text_offset); return map__unmap_ip(map, ip - dso->text_offset);
return ip + map->reloc; return ip + map__reloc(map);
} }
bool map__contains_symbol(const struct map *map, const struct symbol *sym) bool map__contains_symbol(const struct map *map, const struct symbol *sym)
@ -592,12 +592,12 @@ struct maps *map__kmaps(struct map *map)
u64 map__dso_map_ip(const struct map *map, u64 ip) u64 map__dso_map_ip(const struct map *map, u64 ip)
{ {
return ip - map__start(map) + map->pgoff; return ip - map__start(map) + map__pgoff(map);
} }
u64 map__dso_unmap_ip(const struct map *map, u64 ip) u64 map__dso_unmap_ip(const struct map *map, u64 ip)
{ {
return ip + map__start(map) - map->pgoff; return ip + map__start(map) - map__pgoff(map);
} }
u64 identity__map_ip(const struct map *map __maybe_unused, u64 ip) u64 identity__map_ip(const struct map *map __maybe_unused, u64 ip)

View file

@ -72,6 +72,16 @@ static inline u64 map__end(const struct map *map)
return map->end; return map->end;
} }
static inline u64 map__pgoff(const struct map *map)
{
return map->pgoff;
}
static inline u64 map__reloc(const struct map *map)
{
return map->reloc;
}
static inline u32 map__flags(const struct map *map) static inline u32 map__flags(const struct map *map)
{ {
return map->flags; return map->flags;

View file

@ -135,14 +135,14 @@ static int kernel_get_symbol_address_by_name(const char *name, u64 *addr,
/* ref_reloc_sym is just a label. Need a special fix*/ /* ref_reloc_sym is just a label. Need a special fix*/
reloc_sym = kernel_get_ref_reloc_sym(&map); reloc_sym = kernel_get_ref_reloc_sym(&map);
if (reloc_sym && strcmp(name, reloc_sym->name) == 0) if (reloc_sym && strcmp(name, reloc_sym->name) == 0)
*addr = (!map->reloc || reloc) ? reloc_sym->addr : *addr = (!map__reloc(map) || reloc) ? reloc_sym->addr :
reloc_sym->unrelocated_addr; reloc_sym->unrelocated_addr;
else { else {
sym = machine__find_kernel_symbol_by_name(host_machine, name, &map); sym = machine__find_kernel_symbol_by_name(host_machine, name, &map);
if (!sym) if (!sym)
return -ENOENT; return -ENOENT;
*addr = map__unmap_ip(map, sym->start) - *addr = map__unmap_ip(map, sym->start) -
((reloc) ? 0 : map->reloc) - ((reloc) ? 0 : map__reloc(map)) -
((reladdr) ? map__start(map) : 0); ((reladdr) ? map__start(map) : 0);
} }
return 0; return 0;
@ -400,7 +400,7 @@ static int find_alternative_probe_point(struct debuginfo *dinfo,
"Consider identifying the final function used at run time and set the probe directly on that.\n", "Consider identifying the final function used at run time and set the probe directly on that.\n",
pp->function); pp->function);
} else } else
address = map__unmap_ip(map, sym->start) - map->reloc; address = map__unmap_ip(map, sym->start) - map__reloc(map);
break; break;
} }
if (!address) { if (!address) {
@ -866,7 +866,7 @@ post_process_kernel_probe_trace_events(struct probe_trace_event *tevs,
free(tevs[i].point.symbol); free(tevs[i].point.symbol);
tevs[i].point.symbol = tmp; tevs[i].point.symbol = tmp;
tevs[i].point.offset = tevs[i].point.address - tevs[i].point.offset = tevs[i].point.address -
(map->reloc ? reloc_sym->unrelocated_addr : (map__reloc(map) ? reloc_sym->unrelocated_addr :
reloc_sym->addr); reloc_sym->addr);
} }
return skipped; return skipped;

View file

@ -810,11 +810,11 @@ static int maps__split_kallsyms_for_kcore(struct maps *kmaps, struct dso *dso)
continue; continue;
} }
curr_map_dso = map__dso(curr_map); curr_map_dso = map__dso(curr_map);
pos->start -= map__start(curr_map) - curr_map->pgoff; pos->start -= map__start(curr_map) - map__pgoff(curr_map);
if (pos->end > map__end(curr_map)) if (pos->end > map__end(curr_map))
pos->end = map__end(curr_map); pos->end = map__end(curr_map);
if (pos->end) if (pos->end)
pos->end -= map__start(curr_map) - curr_map->pgoff; pos->end -= map__start(curr_map) - map__pgoff(curr_map);
symbols__insert(&curr_map_dso->symbols, pos); symbols__insert(&curr_map_dso->symbols, pos);
++count; ++count;
} }
@ -1459,7 +1459,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
if (new_map == replacement_map) { if (new_map == replacement_map) {
map->start = map__start(new_map); map->start = map__start(new_map);
map->end = map__end(new_map); map->end = map__end(new_map);
map->pgoff = new_map->pgoff; map->pgoff = map__pgoff(new_map);
map->map_ip = new_map->map_ip; map->map_ip = new_map->map_ip;
map->unmap_ip = new_map->unmap_ip; map->unmap_ip = new_map->unmap_ip;
/* Ensure maps are correctly ordered */ /* Ensure maps are correctly ordered */

View file

@ -62,19 +62,19 @@ static int __report_module(struct addr_location *al, u64 ip,
Dwarf_Addr s; Dwarf_Addr s;
dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL); dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL);
if (s != map__start(al->map) - al->map->pgoff) if (s != map__start(al->map) - map__pgoff(al->map))
mod = 0; mod = 0;
} }
if (!mod) if (!mod)
mod = dwfl_report_elf(ui->dwfl, dso->short_name, dso->long_name, -1, mod = dwfl_report_elf(ui->dwfl, dso->short_name, dso->long_name, -1,
map__start(al->map) - al->map->pgoff, false); map__start(al->map) - map__pgoff(al->map), false);
if (!mod) { if (!mod) {
char filename[PATH_MAX]; char filename[PATH_MAX];
if (dso__build_id_filename(dso, filename, sizeof(filename), false)) if (dso__build_id_filename(dso, filename, sizeof(filename), false))
mod = dwfl_report_elf(ui->dwfl, dso->short_name, filename, -1, mod = dwfl_report_elf(ui->dwfl, dso->short_name, filename, -1,
map__start(al->map) - al->map->pgoff, false); map__start(al->map) - map__pgoff(al->map), false);
} }
if (mod) { if (mod) {