diff options
| author | Zecheng Li <zecheng@google.com> | 2025-08-25 19:58:17 +0000 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2025-09-19 12:14:30 -0300 |
| commit | e7ace97fcf6d2eb458bd7e16bba8e3f24d396e9b (patch) | |
| tree | 34515d9746d5bbaad6867bee5bee386c47edf9aa /tools/perf/util | |
| parent | perf dwarf-aux: Better variable collection for insn tracking (diff) | |
| download | linux-e7ace97fcf6d2eb458bd7e16bba8e3f24d396e9b.tar.gz linux-e7ace97fcf6d2eb458bd7e16bba8e3f24d396e9b.zip | |
perf dwarf-aux: Fix __die_find_scope_cb() for namespaces
Currently __die_find_scope_cb() goes to check siblings when the DIE
doesn't include the given PC.
However namespaces don't have a PC and could contain children that have
that PC.
When we encounter a namespace, we should check both its children and
siblings.
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Zecheng Li <zecheng@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Xu Liu <xliuprof@google.com>
Link: https://lore.kernel.org/r/20250825195817.226560-1-zecheng@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util')
| -rw-r--r-- | tools/perf/util/dwarf-aux.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c index 6fd2db5d9381..9267af204c7d 100644 --- a/tools/perf/util/dwarf-aux.c +++ b/tools/perf/util/dwarf-aux.c @@ -1958,6 +1958,7 @@ struct find_scope_data { static int __die_find_scope_cb(Dwarf_Die *die_mem, void *arg) { struct find_scope_data *data = arg; + int tag = dwarf_tag(die_mem); if (dwarf_haspc(die_mem, data->pc)) { Dwarf_Die *tmp; @@ -1971,6 +1972,14 @@ static int __die_find_scope_cb(Dwarf_Die *die_mem, void *arg) data->nr++; return DIE_FIND_CB_CHILD; } + + /* + * If the DIE doesn't have the PC, we still need to check its children + * and siblings if it's a container like a namespace. + */ + if (tag == DW_TAG_namespace) + return DIE_FIND_CB_CONTINUE; + return DIE_FIND_CB_SIBLING; } |
