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:
Ian Rogers
2026-01-22 13:35:14 -08:00
committed by Arnaldo Carvalho de Melo
parent 5301cc6988
commit c4e3a00356
18 changed files with 47 additions and 44 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -11,7 +11,6 @@ struct symbol;
struct addr_location {
struct thread *thread;
struct maps *maps;
struct map *map;
struct symbol *sym;
const char *srcline;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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';

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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) {
/*

View File

@@ -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,
},

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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;
};

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 : "''",