perf callchain: Always populate the addr_location map when adding IP
authorIan Rogers <irogers@google.com>
Thu, 29 May 2025 04:39:37 +0000 (21:39 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sat, 31 May 2025 11:58:30 +0000 (08:58 -0300)
Dropping symbols also meant the callchain maps wasn't populated, but
the callchain map is needed to find the DSO.

Plumb the symbols option better, falling back to thread__find_map()
rather than thread__find_symbol() when symbols are disabled.

Fixes: 02b2705017d2e5ad ("perf callchain: Allow symbols to be optional when resolving a callchain")
Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.ibm.com>
Cc: Ben Gainey <ben.gainey@arm.com>
Cc: Chaitanya S Prakash <chaitanyas.prakash@arm.com>
Cc: Charlie Jenkins <charlie@rivosinc.com>
Cc: Chun-Tse Shao <ctshao@google.com>
Cc: Colin Ian King <colin.i.king@gmail.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: Graham Woodward <graham.woodward@arm.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ilkka Koskinen <ilkka@os.amperecomputing.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
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: Krzysztof Łopatowski <krzysztof.m.lopatowski@gmail.com>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Levi Yun <yeoreum.yun@arm.com>
Cc: Li Huafei <lihuafei1@huawei.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Martin Liška <martin.liska@hey.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Matt Fleming <matt@readmodwrite.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Song Liu <song@kernel.org>
Cc: Steinar H. Gunderson <sesse@google.com>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Cc: Steve Clevenger <scclevenger@os.amperecomputing.com>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Cc: Veronika Molnarova <vmolnaro@redhat.com>
Cc: Weilin Wang <weilin.wang@intel.com>
Cc: Will Deacon <will@kernel.org>
Cc: Yicong Yang <yangyicong@hisilicon.com>
Cc: Yujie Liu <yujie.liu@intel.com>
Cc: Zhongqiu Han <quic_zhonhan@quicinc.com>
Cc: Zixian Cai <fzczx123@gmail.com>
Link: https://lore.kernel.org/r/20250529044000.759937-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/machine.c
tools/perf/util/thread.c
tools/perf/util/thread.h

index c5e28d15323faec13822dcaea6dada87af967a34..7ec12c207970ca2ecdd03064ee51cddfa26d4fb9 100644 (file)
@@ -2011,7 +2011,7 @@ static void ip__resolve_ams(struct thread *thread,
         * Thus, we have to try consecutively until we find a match
         * or else, the symbol is unknown
         */
-       thread__find_cpumode_addr_location(thread, ip, &al);
+       thread__find_cpumode_addr_location(thread, ip, /*symbols=*/true, &al);
 
        ams->addr = ip;
        ams->al_addr = al.addr;
@@ -2113,7 +2113,7 @@ static int add_callchain_ip(struct thread *thread,
        al.sym = NULL;
        al.srcline = NULL;
        if (!cpumode) {
-               thread__find_cpumode_addr_location(thread, ip, &al);
+               thread__find_cpumode_addr_location(thread, ip, symbols, &al);
        } else {
                if (ip >= PERF_CONTEXT_MAX) {
                        switch (ip) {
@@ -2141,6 +2141,8 @@ static int add_callchain_ip(struct thread *thread,
                }
                if (symbols)
                        thread__find_symbol(thread, *cpumode, ip, &al);
+               else
+                       thread__find_map(thread, *cpumode, ip, &al);
        }
 
        if (al.sym != NULL) {
index 415c0e5d1e751a47b16ae0b622aae2e0bac1f362..ffb48cc2103fed1efa81d784f26fad57db3d5ffb 100644 (file)
@@ -410,7 +410,7 @@ int thread__fork(struct thread *thread, struct thread *parent, u64 timestamp, bo
 }
 
 void thread__find_cpumode_addr_location(struct thread *thread, u64 addr,
-                                       struct addr_location *al)
+                                       bool symbols, struct addr_location *al)
 {
        size_t i;
        const u8 cpumodes[] = {
@@ -421,7 +421,11 @@ void thread__find_cpumode_addr_location(struct thread *thread, u64 addr,
        };
 
        for (i = 0; i < ARRAY_SIZE(cpumodes); i++) {
-               thread__find_symbol(thread, cpumodes[i], addr, al);
+               if (symbols)
+                       thread__find_symbol(thread, cpumodes[i], addr, al);
+               else
+                       thread__find_map(thread, cpumodes[i], addr, al);
+
                if (al->map)
                        break;
        }
index cd574a896418ac9497a8544c8417c3aa6fa86ae6..2b90bbed7a61218cc591e558178197f100b7df54 100644 (file)
@@ -126,7 +126,7 @@ struct symbol *thread__find_symbol_fb(struct thread *thread, u8 cpumode,
                                      u64 addr, struct addr_location *al);
 
 void thread__find_cpumode_addr_location(struct thread *thread, u64 addr,
-                                       struct addr_location *al);
+                                       bool symbols, struct addr_location *al);
 
 int thread__memcpy(struct thread *thread, struct machine *machine,
                   void *buf, u64 ip, int len, bool *is64bit);