mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-02 07:00:42 -04:00
perf map_symbol: Switch from holding maps to holding thread
maps may belong to >1 thread. In contexts like symbolization information from the thread may be useful, such as the ELF machine. As the maps can be gained from the thread switch from holding maps in struct map_symbol to holding the thread. Holding the maps in addr_location is also redundant, switch this to using thread__maps. Reviewed-by: James Clark <james.clark@linaro.org> Signed-off-by: Ian Rogers <irogers@google.com> Cc: Aditya Bodkhe <aditya.b1@linux.ibm.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexandre Ghiti <alex@ghiti.fr> Cc: Athira Rajeev <atrajeev@linux.ibm.com> Cc: Bill Wendling <morbo@google.com> Cc: Dr. David Alan Gilbert <linux@treblig.org> Cc: Guo Ren <guoren@kernel.org> Cc: Howard Chu <howardchu95@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.g.garry@oracle.com> Cc: Julia Lawall <Julia.Lawall@inria.fr> Cc: Justin Stitt <justinstitt@google.com> Cc: Krzysztof Łopatowski <krzysztof.m.lopatowski@gmail.com> Cc: Leo Yan <leo.yan@linux.dev> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <nick.desaulniers+lkml@gmail.com> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <pjw@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sergei Trofimovich <slyich@gmail.com> Cc: Shimin Guo <shimin.guo@skydio.com> Cc: Suchit Karunakaran <suchitkarunakaran@gmail.com> Cc: Thomas Falcon <thomas.falcon@intel.com> Cc: Tianyou Li <tianyou.li@intel.com> Cc: Will Deacon <will@kernel.org> Cc: Zecheng Li <zecheng@google.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
5301cc6988
commit
c4e3a00356
@@ -601,7 +601,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser,
|
||||
return true;
|
||||
}
|
||||
|
||||
target_ms.maps = ms->maps;
|
||||
target_ms.thread = ms->thread;
|
||||
target_ms.map = ms->map;
|
||||
target_ms.sym = dl->ops.target.sym;
|
||||
annotation__unlock(notes);
|
||||
|
||||
@@ -3189,7 +3189,8 @@ static int evsel__hists_browse(struct evsel *evsel, int nr_events, const char *h
|
||||
case 'k':
|
||||
if (browser->selection != NULL)
|
||||
hists_browser__zoom_map(browser,
|
||||
maps__machine(browser->selection->maps)->vmlinux_map);
|
||||
maps__machine(thread__maps(browser->selection->thread)
|
||||
)->vmlinux_map);
|
||||
continue;
|
||||
case 'V':
|
||||
verbose = (verbose + 1) % 4;
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
void addr_location__init(struct addr_location *al)
|
||||
{
|
||||
al->thread = NULL;
|
||||
al->maps = NULL;
|
||||
al->map = NULL;
|
||||
al->sym = NULL;
|
||||
al->srcline = NULL;
|
||||
@@ -30,16 +29,13 @@ void addr_location__exit(struct addr_location *al)
|
||||
{
|
||||
map__zput(al->map);
|
||||
thread__zput(al->thread);
|
||||
maps__zput(al->maps);
|
||||
}
|
||||
|
||||
void addr_location__copy(struct addr_location *dst, struct addr_location *src)
|
||||
{
|
||||
thread__put(dst->thread);
|
||||
maps__put(dst->maps);
|
||||
map__put(dst->map);
|
||||
*dst = *src;
|
||||
dst->thread = thread__get(src->thread);
|
||||
dst->maps = maps__get(src->maps);
|
||||
dst->map = map__get(src->map);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@ struct symbol;
|
||||
|
||||
struct addr_location {
|
||||
struct thread *thread;
|
||||
struct maps *maps;
|
||||
struct map *map;
|
||||
struct symbol *sym;
|
||||
const char *srcline;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "../map.h"
|
||||
#include "../maps.h"
|
||||
#include "../symbol.h"
|
||||
#include "../thread.h"
|
||||
|
||||
static int loongarch_call__parse(const struct arch *arch, struct ins_operands *ops,
|
||||
struct map_symbol *ms,
|
||||
@@ -49,7 +50,7 @@ static int loongarch_call__parse(const struct arch *arch, struct ins_operands *o
|
||||
.addr = map__objdump_2mem(map, ops->target.addr),
|
||||
};
|
||||
|
||||
if (maps__find_ams(ms->maps, &target) == 0 &&
|
||||
if (maps__find_ams(thread__maps(ms->thread), &target) == 0 &&
|
||||
map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
|
||||
ops->target.sym = target.ms.sym;
|
||||
|
||||
@@ -93,7 +94,7 @@ static int loongarch_jump__parse(const struct arch *arch, struct ins_operands *o
|
||||
|
||||
ops->target.outside = target.addr < start || target.addr > end;
|
||||
|
||||
if (maps__find_ams(ms->maps, &target) == 0 &&
|
||||
if (maps__find_ams(thread__maps(ms->thread), &target) == 0 &&
|
||||
map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
|
||||
ops->target.sym = target.ms.sym;
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "../map.h"
|
||||
#include "../maps.h"
|
||||
#include "../symbol.h"
|
||||
#include "../thread.h"
|
||||
#include "../annotate.h"
|
||||
#include "../annotate-data.h"
|
||||
|
||||
@@ -49,7 +50,7 @@ static int s390_call__parse(const struct arch *arch, struct ins_operands *ops,
|
||||
.addr = map__objdump_2mem(map, ops->target.addr),
|
||||
};
|
||||
|
||||
if (maps__find_ams(ms->maps, &target) == 0 &&
|
||||
if (maps__find_ams(thread__maps(ms->thread), &target) == 0 &&
|
||||
map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
|
||||
ops->target.sym = target.ms.sym;
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "callchain.h"
|
||||
#include "branch.h"
|
||||
#include "symbol.h"
|
||||
#include "thread.h"
|
||||
#include "util.h"
|
||||
#include "../perf.h"
|
||||
|
||||
@@ -1042,7 +1043,7 @@ merge_chain_branch(struct callchain_cursor *cursor,
|
||||
|
||||
list_for_each_entry_safe(list, next_list, &src->val, list) {
|
||||
struct map_symbol ms = {
|
||||
.maps = maps__get(list->ms.maps),
|
||||
.thread = thread__get(list->ms.thread),
|
||||
.map = map__get(list->ms.map),
|
||||
};
|
||||
callchain_cursor_append(cursor, list->ip, &ms, false, NULL, 0, 0, 0, list->srcline);
|
||||
@@ -1147,10 +1148,11 @@ int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *samp
|
||||
int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *node,
|
||||
bool hide_unresolved)
|
||||
{
|
||||
struct machine *machine = node->ms.maps ? maps__machine(node->ms.maps) : NULL;
|
||||
struct machine *machine = NULL;
|
||||
|
||||
if (node->ms.thread)
|
||||
machine = maps__machine(thread__maps(node->ms.thread));
|
||||
|
||||
maps__put(al->maps);
|
||||
al->maps = maps__get(node->ms.maps);
|
||||
map__put(al->map);
|
||||
al->map = map__get(node->ms.map);
|
||||
al->sym = node->ms.sym;
|
||||
@@ -1163,7 +1165,7 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
|
||||
if (al->map == NULL)
|
||||
goto out;
|
||||
}
|
||||
if (maps__equal(al->maps, machine__kernel_maps(machine))) {
|
||||
if (maps__equal(thread__maps(al->thread), machine__kernel_maps(machine))) {
|
||||
if (machine__is_host(machine)) {
|
||||
al->cpumode = PERF_RECORD_MISC_KERNEL;
|
||||
al->level = 'k';
|
||||
|
||||
@@ -268,7 +268,8 @@ int symbol__disassemble_capstone(const char *filename __maybe_unused,
|
||||
!strcmp(args->options->disassembler_style, "att"))
|
||||
disassembler_style = true;
|
||||
|
||||
if (capstone_init(maps__machine(args->ms->maps), &handle, is_64bit, disassembler_style) < 0)
|
||||
if (capstone_init(maps__machine(thread__maps(args->ms->thread)), &handle, is_64bit,
|
||||
disassembler_style) < 0)
|
||||
goto err;
|
||||
|
||||
needs_cs_close = true;
|
||||
@@ -382,7 +383,8 @@ int symbol__disassemble_capstone_powerpc(const char *filename __maybe_unused,
|
||||
!strcmp(args->options->disassembler_style, "att"))
|
||||
disassembler_style = true;
|
||||
|
||||
if (capstone_init(maps__machine(args->ms->maps), &handle, is_64bit, disassembler_style) < 0)
|
||||
if (capstone_init(maps__machine(thread__maps(args->ms->thread)), &handle, is_64bit,
|
||||
disassembler_style) < 0)
|
||||
goto err;
|
||||
|
||||
needs_cs_close = true;
|
||||
|
||||
@@ -254,7 +254,6 @@ static struct call_path *call_path_from_sample(struct db_export *dbe,
|
||||
addr_location__init(&al);
|
||||
al.sym = node->ms.sym;
|
||||
al.map = map__get(node->ms.map);
|
||||
al.maps = maps__get(thread__maps(thread));
|
||||
al.addr = node->ip;
|
||||
al.thread = thread__get(thread);
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "namespaces.h"
|
||||
#include "srcline.h"
|
||||
#include "symbol.h"
|
||||
#include "thread.h"
|
||||
#include "util.h"
|
||||
|
||||
static regex_t file_lineno;
|
||||
@@ -277,7 +278,7 @@ static int call__parse(const struct arch *arch, struct ins_operands *ops, struct
|
||||
.addr = map__objdump_2mem(map, ops->target.addr),
|
||||
};
|
||||
|
||||
if (maps__find_ams(ms->maps, &target) == 0 &&
|
||||
if (maps__find_ams(thread__maps(ms->thread), &target) == 0 &&
|
||||
map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
|
||||
ops->target.sym = target.ms.sym;
|
||||
|
||||
@@ -411,7 +412,7 @@ static int jump__parse(const struct arch *arch, struct ins_operands *ops, struct
|
||||
* Actual navigation will come next, with further understanding of how
|
||||
* the symbol searching and disassembly should be done.
|
||||
*/
|
||||
if (maps__find_ams(ms->maps, &target) == 0 &&
|
||||
if (maps__find_ams(thread__maps(ms->thread), &target) == 0 &&
|
||||
map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
|
||||
ops->target.sym = target.ms.sym;
|
||||
|
||||
@@ -1074,7 +1075,7 @@ static int symbol__parse_objdump_line(struct symbol *sym,
|
||||
.ms = { .map = map__get(map), },
|
||||
};
|
||||
|
||||
if (!maps__find_ams(args->ms->maps, &target) &&
|
||||
if (!maps__find_ams(thread__maps(args->ms->thread), &target) &&
|
||||
target.ms.sym->start == target.al_addr)
|
||||
dl->ops.target.sym = target.ms.sym;
|
||||
|
||||
|
||||
@@ -698,7 +698,6 @@ struct map *thread__find_map(struct thread *thread, u8 cpumode, u64 addr,
|
||||
struct machine *machine = maps__machine(maps);
|
||||
bool load_map = false;
|
||||
|
||||
maps__zput(al->maps);
|
||||
map__zput(al->map);
|
||||
thread__zput(al->thread);
|
||||
al->thread = thread__get(thread);
|
||||
@@ -736,7 +735,6 @@ struct map *thread__find_map(struct thread *thread, u8 cpumode, u64 addr,
|
||||
|
||||
return NULL;
|
||||
}
|
||||
al->maps = maps__get(maps);
|
||||
al->map = maps__find(maps, al->addr);
|
||||
if (al->map != NULL) {
|
||||
/*
|
||||
|
||||
@@ -251,7 +251,7 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
|
||||
|
||||
if (h->cgroup) {
|
||||
const char *cgrp_name = "unknown";
|
||||
struct cgroup *cgrp = cgroup__find(maps__machine(h->ms.maps)->env,
|
||||
struct cgroup *cgrp = cgroup__find(maps__machine(thread__maps(h->ms.thread))->env,
|
||||
h->cgroup);
|
||||
if (cgrp != NULL)
|
||||
cgrp_name = cgrp->name;
|
||||
@@ -536,7 +536,7 @@ static int hist_entry__init(struct hist_entry *he,
|
||||
memset(&he->stat, 0, sizeof(he->stat));
|
||||
}
|
||||
|
||||
he->ms.maps = maps__get(he->ms.maps);
|
||||
he->ms.thread = thread__get(he->ms.thread);
|
||||
he->ms.map = map__get(he->ms.map);
|
||||
|
||||
if (he->branch_info) {
|
||||
@@ -552,9 +552,9 @@ static int hist_entry__init(struct hist_entry *he,
|
||||
memcpy(he->branch_info, template->branch_info,
|
||||
sizeof(*he->branch_info));
|
||||
|
||||
he->branch_info->from.ms.maps = maps__get(he->branch_info->from.ms.maps);
|
||||
he->branch_info->from.ms.thread = thread__get(he->branch_info->from.ms.thread);
|
||||
he->branch_info->from.ms.map = map__get(he->branch_info->from.ms.map);
|
||||
he->branch_info->to.ms.maps = maps__get(he->branch_info->to.ms.maps);
|
||||
he->branch_info->to.ms.thread = thread__get(he->branch_info->to.ms.thread);
|
||||
he->branch_info->to.ms.map = map__get(he->branch_info->to.ms.map);
|
||||
}
|
||||
|
||||
@@ -810,7 +810,7 @@ __hists__add_entry(struct hists *hists,
|
||||
},
|
||||
.cgroup = sample->cgroup,
|
||||
.ms = {
|
||||
.maps = al->maps,
|
||||
.thread = al->thread,
|
||||
.map = al->map,
|
||||
.sym = al->sym,
|
||||
},
|
||||
@@ -890,7 +890,7 @@ struct hist_entry *hists__add_entry_block(struct hists *hists,
|
||||
.block_info = block_info,
|
||||
.hists = hists,
|
||||
.ms = {
|
||||
.maps = al->maps,
|
||||
.thread = al->thread,
|
||||
.map = al->map,
|
||||
.sym = al->sym,
|
||||
},
|
||||
@@ -1020,8 +1020,8 @@ iter_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *al)
|
||||
if (iter->curr >= iter->total)
|
||||
return 0;
|
||||
|
||||
maps__put(al->maps);
|
||||
al->maps = maps__get(bi[i].to.ms.maps);
|
||||
thread__put(al->thread);
|
||||
al->thread = thread__get(bi[i].to.ms.thread);
|
||||
map__put(al->map);
|
||||
al->map = map__get(bi[i].to.ms.map);
|
||||
al->sym = bi[i].to.ms.sym;
|
||||
@@ -1232,7 +1232,7 @@ iter_add_next_cumulative_entry(struct hist_entry_iter *iter,
|
||||
.comm = thread__comm(al->thread),
|
||||
.ip = al->addr,
|
||||
.ms = {
|
||||
.maps = al->maps,
|
||||
.thread = al->thread,
|
||||
.map = al->map,
|
||||
.sym = al->sym,
|
||||
},
|
||||
|
||||
@@ -2016,7 +2016,7 @@ static void ip__resolve_ams(struct thread *thread,
|
||||
ams->addr = ip;
|
||||
ams->al_addr = al.addr;
|
||||
ams->al_level = al.level;
|
||||
ams->ms.maps = maps__get(al.maps);
|
||||
ams->ms.thread = thread__get(al.thread);
|
||||
ams->ms.sym = al.sym;
|
||||
ams->ms.map = map__get(al.map);
|
||||
ams->phys_addr = 0;
|
||||
@@ -2037,7 +2037,7 @@ static void ip__resolve_data(struct thread *thread,
|
||||
ams->addr = addr;
|
||||
ams->al_addr = al.addr;
|
||||
ams->al_level = al.level;
|
||||
ams->ms.maps = maps__get(al.maps);
|
||||
ams->ms.thread = thread__get(al.thread);
|
||||
ams->ms.sym = al.sym;
|
||||
ams->ms.map = map__get(al.map);
|
||||
ams->phys_addr = phys_addr;
|
||||
@@ -2120,7 +2120,7 @@ static int append_inlines(struct callchain_cursor *cursor, struct map_symbol *ms
|
||||
}
|
||||
|
||||
ilist_ms = (struct map_symbol) {
|
||||
.maps = maps__get(ms->maps),
|
||||
.thread = thread__get(ms->thread),
|
||||
.map = map__get(map),
|
||||
};
|
||||
list_for_each_entry(ilist, &inline_node->val, list) {
|
||||
@@ -2220,7 +2220,7 @@ static int add_callchain_ip(struct thread *thread,
|
||||
iter_cycles = iter->cycles;
|
||||
}
|
||||
|
||||
ms.maps = maps__get(al.maps);
|
||||
ms.thread = thread__get(al.thread);
|
||||
ms.map = map__get(al.map);
|
||||
ms.sym = al.sym;
|
||||
|
||||
@@ -2383,7 +2383,7 @@ static void save_lbr_cursor_node(struct thread *thread,
|
||||
map_symbol__exit(&lbr_stitch->prev_lbr_cursor[idx].ms);
|
||||
memcpy(&lbr_stitch->prev_lbr_cursor[idx], cursor->curr,
|
||||
sizeof(struct callchain_cursor_node));
|
||||
lbr_stitch->prev_lbr_cursor[idx].ms.maps = maps__get(cursor->curr->ms.maps);
|
||||
lbr_stitch->prev_lbr_cursor[idx].ms.thread = thread__get(cursor->curr->ms.thread);
|
||||
lbr_stitch->prev_lbr_cursor[idx].ms.map = map__get(cursor->curr->ms.map);
|
||||
|
||||
lbr_stitch->prev_lbr_cursor[idx].valid = true;
|
||||
@@ -2596,7 +2596,8 @@ static bool has_stitched_lbr(struct thread *thread,
|
||||
memcpy(&stitch_node->cursor, &lbr_stitch->prev_lbr_cursor[i],
|
||||
sizeof(struct callchain_cursor_node));
|
||||
|
||||
stitch_node->cursor.ms.maps = maps__get(lbr_stitch->prev_lbr_cursor[i].ms.maps);
|
||||
stitch_node->cursor.ms.thread =
|
||||
thread__get(lbr_stitch->prev_lbr_cursor[i].ms.thread);
|
||||
stitch_node->cursor.ms.map = map__get(lbr_stitch->prev_lbr_cursor[i].ms.map);
|
||||
|
||||
if (callee)
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
#include "map_symbol.h"
|
||||
#include "maps.h"
|
||||
#include "map.h"
|
||||
#include "thread.h"
|
||||
|
||||
void map_symbol__exit(struct map_symbol *ms)
|
||||
{
|
||||
maps__zput(ms->maps);
|
||||
thread__zput(ms->thread);
|
||||
map__zput(ms->map);
|
||||
}
|
||||
|
||||
@@ -16,7 +17,7 @@ void addr_map_symbol__exit(struct addr_map_symbol *ams)
|
||||
|
||||
void map_symbol__copy(struct map_symbol *dst, struct map_symbol *src)
|
||||
{
|
||||
dst->maps = maps__get(src->maps);
|
||||
dst->thread = thread__get(src->thread);
|
||||
dst->map = map__get(src->map);
|
||||
dst->sym = src->sym;
|
||||
}
|
||||
|
||||
@@ -4,12 +4,13 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct thread;
|
||||
struct maps;
|
||||
struct map;
|
||||
struct symbol;
|
||||
|
||||
struct map_symbol {
|
||||
struct maps *maps;
|
||||
struct thread *thread;
|
||||
struct map *map;
|
||||
struct symbol *sym;
|
||||
};
|
||||
|
||||
@@ -1016,7 +1016,7 @@ static int hist_entry__cgroup_snprintf(struct hist_entry *he,
|
||||
const char *cgrp_name = "N/A";
|
||||
|
||||
if (he->cgroup) {
|
||||
struct cgroup *cgrp = cgroup__find(maps__machine(he->ms.maps)->env,
|
||||
struct cgroup *cgrp = cgroup__find(maps__machine(thread__maps(he->ms.thread))->env,
|
||||
he->cgroup);
|
||||
if (cgrp != NULL)
|
||||
cgrp_name = cgrp->name;
|
||||
|
||||
@@ -161,7 +161,7 @@ static int entry(u64 ip, struct unwind_info *ui)
|
||||
}
|
||||
|
||||
e->ip = ip;
|
||||
e->ms.maps = maps__get(al.maps);
|
||||
e->ms.thread = thread__get(al.thread);
|
||||
e->ms.map = map__get(al.map);
|
||||
e->ms.sym = al.sym;
|
||||
|
||||
|
||||
@@ -666,7 +666,7 @@ static int entry(u64 ip, struct thread *thread,
|
||||
e.ms.sym = thread__find_symbol(thread, PERF_RECORD_MISC_USER, ip, &al);
|
||||
e.ip = ip;
|
||||
e.ms.map = al.map;
|
||||
e.ms.maps = al.maps;
|
||||
e.ms.thread = thread__get(al.thread);
|
||||
|
||||
pr_debug("unwind: %s:ip = 0x%" PRIx64 " (0x%" PRIx64 ")\n",
|
||||
al.sym ? al.sym->name : "''",
|
||||
|
||||
Reference in New Issue
Block a user