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:
Родитель
ddee3f2bdd
Коммит
2a6e5e8a2a
|
@ -61,7 +61,7 @@ int perf_event__synthesize_extra_kmaps(struct perf_tool *tool,
|
|||
|
||||
event->mmap.start = map__start(map);
|
||||
event->mmap.len = map__size(map);
|
||||
event->mmap.pgoff = map->pgoff;
|
||||
event->mmap.pgoff = map__pgoff(map);
|
||||
event->mmap.pid = machine->pid;
|
||||
|
||||
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)
|
|||
prot & PROT_WRITE ? 'w' : '-',
|
||||
prot & PROT_EXEC ? 'x' : '-',
|
||||
map__flags(map) ? 's' : 'p',
|
||||
map->pgoff,
|
||||
map__pgoff(map),
|
||||
dso->id.ino, dso->name);
|
||||
}
|
||||
|
||||
|
|
|
@ -335,10 +335,10 @@ next_pair:
|
|||
}
|
||||
|
||||
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))
|
||||
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);
|
||||
pair->priv = 1;
|
||||
}
|
||||
|
|
|
@ -1277,9 +1277,9 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine,
|
|||
if (!kmap || !is_entry_trampoline(kmap->name))
|
||||
continue;
|
||||
|
||||
dest_map = maps__find(kmaps, map->pgoff);
|
||||
dest_map = maps__find(kmaps, map__pgoff(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;
|
||||
}
|
||||
if (found || machine->trampolines_mapped)
|
||||
|
|
|
@ -421,7 +421,7 @@ size_t map__fprintf(struct map *map, FILE *fp)
|
|||
const struct dso *dso = map__dso(map);
|
||||
|
||||
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)
|
||||
|
@ -510,7 +510,7 @@ u64 map__rip_2objdump(struct map *map, u64 rip)
|
|||
return rip;
|
||||
|
||||
if (dso->rel)
|
||||
return rip - map->pgoff;
|
||||
return rip - map__pgoff(map);
|
||||
|
||||
/*
|
||||
* 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)
|
||||
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);
|
||||
|
||||
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,
|
||||
|
@ -551,7 +551,7 @@ u64 map__objdump_2mem(struct map *map, u64 ip)
|
|||
if (dso->kernel == DSO_SPACE__USER)
|
||||
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)
|
||||
|
@ -592,12 +592,12 @@ struct maps *map__kmaps(struct map *map)
|
|||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
|
|
|
@ -72,6 +72,16 @@ static inline u64 map__end(const struct map *map)
|
|||
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)
|
||||
{
|
||||
return map->flags;
|
||||
|
|
|
@ -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*/
|
||||
reloc_sym = kernel_get_ref_reloc_sym(&map);
|
||||
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;
|
||||
else {
|
||||
sym = machine__find_kernel_symbol_by_name(host_machine, name, &map);
|
||||
if (!sym)
|
||||
return -ENOENT;
|
||||
*addr = map__unmap_ip(map, sym->start) -
|
||||
((reloc) ? 0 : map->reloc) -
|
||||
((reloc) ? 0 : map__reloc(map)) -
|
||||
((reladdr) ? map__start(map) : 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",
|
||||
pp->function);
|
||||
} else
|
||||
address = map__unmap_ip(map, sym->start) - map->reloc;
|
||||
address = map__unmap_ip(map, sym->start) - map__reloc(map);
|
||||
break;
|
||||
}
|
||||
if (!address) {
|
||||
|
@ -866,7 +866,7 @@ post_process_kernel_probe_trace_events(struct probe_trace_event *tevs,
|
|||
free(tevs[i].point.symbol);
|
||||
tevs[i].point.symbol = tmp;
|
||||
tevs[i].point.offset = tevs[i].point.address -
|
||||
(map->reloc ? reloc_sym->unrelocated_addr :
|
||||
(map__reloc(map) ? reloc_sym->unrelocated_addr :
|
||||
reloc_sym->addr);
|
||||
}
|
||||
return skipped;
|
||||
|
|
|
@ -810,11 +810,11 @@ static int maps__split_kallsyms_for_kcore(struct maps *kmaps, struct dso *dso)
|
|||
continue;
|
||||
}
|
||||
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))
|
||||
pos->end = map__end(curr_map);
|
||||
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);
|
||||
++count;
|
||||
}
|
||||
|
@ -1459,7 +1459,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
|
|||
if (new_map == replacement_map) {
|
||||
map->start = map__start(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->unmap_ip = new_map->unmap_ip;
|
||||
/* Ensure maps are correctly ordered */
|
||||
|
|
|
@ -62,19 +62,19 @@ static int __report_module(struct addr_location *al, u64 ip,
|
|||
Dwarf_Addr s;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (!mod)
|
||||
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) {
|
||||
char filename[PATH_MAX];
|
||||
|
||||
if (dso__build_id_filename(dso, filename, sizeof(filename), false))
|
||||
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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче