Commit 2a6e5e8a authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

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: default avatarIan 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ddee3f2b
...@@ -61,7 +61,7 @@ int perf_event__synthesize_extra_kmaps(struct perf_tool *tool, ...@@ -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);
......
...@@ -857,7 +857,7 @@ static size_t maps__fprintf_task(struct maps *maps, int indent, FILE *fp) ...@@ -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);
} }
......
...@@ -335,10 +335,10 @@ static int test__vmlinux_matches_kallsyms(struct test_suite *test __maybe_unused ...@@ -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;
} }
......
...@@ -1277,9 +1277,9 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine, ...@@ -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)
......
...@@ -421,7 +421,7 @@ size_t map__fprintf(struct map *map, FILE *fp) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -72,6 +72,16 @@ static inline u64 map__end(const struct map *map) ...@@ -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;
......
...@@ -135,14 +135,14 @@ static int kernel_get_symbol_address_by_name(const char *name, u64 *addr, ...@@ -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, ...@@ -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, ...@@ -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;
......
...@@ -810,11 +810,11 @@ static int maps__split_kallsyms_for_kcore(struct maps *kmaps, struct dso *dso) ...@@ -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, ...@@ -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 */
......
...@@ -62,19 +62,19 @@ static int __report_module(struct addr_location *al, u64 ip, ...@@ -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) {
......
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