perf tools: Add skip check in tool_pmu__event_to_str()
authorKan Liang <kan.liang@linux.intel.com>
Fri, 7 Feb 2025 15:28:44 +0000 (07:28 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Mon, 10 Feb 2025 19:46:30 +0000 (11:46 -0800)
Some topdown related metrics may fail on hybrid machines.

 $ perf stat -M tma_frontend_bound
 Cannot resolve IDs for tma_frontend_bound:
 cpu_atom@TOPDOWN_FE_BOUND.ALL@ / (8 * cpu_atom@CPU_CLK_UNHALTED.CORE@)

In the find_tool_events(), the tool_pmu__event_to_str() is used to
compare the tool_events. It only checks the event name, no PMU or arch.
So the tool_events[TOOL_PMU__EVENT_SLOTS] is set to true, because the
p-core Topdown metrics has "slots" event.
The tool_events is shared. So when parsing the e-core metrics, the
"slots" is automatically added.

The "slots" event as a tool event should only be available on arm64. It
has a different meaning on X86. The tool_pmu__skip_event() intends
handle the case. Apply it for tool_pmu__event_to_str() as well.

There is a lack of sanity check in the expr__get_id(). Add the check.

Closes: https://lore.kernel.org/lkml/608077bc-4139-4a97-8dc4-7997177d95c4@linux.intel.com/
Fixes: 069057239a67 ("perf tool_pmu: Move expr literals to tool_pmu")
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Cc: thomas.falcon@intel.com
Link: https://lore.kernel.org/r/20250207152844.302167-1-kan.liang@linux.intel.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/expr.c
tools/perf/util/tool_pmu.c

index c221dcce666609562daa827598aec5c4e6c4c03e..6413537442aa80a001b6fffef941f634302b4567 100644 (file)
@@ -215,6 +215,8 @@ int expr__add_ref(struct expr_parse_ctx *ctx, struct metric_ref *ref)
 int expr__get_id(struct expr_parse_ctx *ctx, const char *id,
                 struct expr_id_data **data)
 {
+       if (!ctx || !id)
+               return -1;
        return hashmap__find(ctx->ids, id, data) ? 0 : -1;
 }
 
index 4fb09757847944599e3eb0a96e6cc1d5c835f578..3a68debe71437eb96b18b9455824e6e614ec2c45 100644 (file)
@@ -62,7 +62,8 @@ int tool_pmu__num_skip_events(void)
 
 const char *tool_pmu__event_to_str(enum tool_pmu_event ev)
 {
-       if (ev > TOOL_PMU__EVENT_NONE && ev < TOOL_PMU__EVENT_MAX)
+       if ((ev > TOOL_PMU__EVENT_NONE && ev < TOOL_PMU__EVENT_MAX) &&
+           !tool_pmu__skip_event(tool_pmu__event_names[ev]))
                return tool_pmu__event_names[ev];
 
        return NULL;