Messages in this thread Patch in this message | | | From | kan.liang@linux ... | Subject | [PATCH V7 13/14] perf, tools, stat: Check Topdown Metric group | Date | Thu, 23 Jul 2020 10:11:16 -0700 |
| |
From: Kan Liang <kan.liang@linux.intel.com>
The slots event is required in a Topdown Metric group.
Add a check to examine the Topdown Metric group. Error out if there is no slots event detected.
Only check the group on the platform which using topdown_metric_attrs, e.g. Ice Lake.
Signed-off-by: Kan Liang <kan.liang@linux.intel.com> --- tools/perf/builtin-stat.c | 72 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 078ea1485317..9886aef78440 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1441,6 +1441,72 @@ static int topdown_filter_events(const char **attr, char **str, bool use_group) return 0; } +/* Event encoding for Topdown Metric events */ +#define TOPDOWN_SLOTS 0x0400 +#define TOPDOWN_RETIRE 0x8000 +#define TOPDOWN_BAD_SPEC 0x8100 +#define TOPDOWN_FE_BOUND 0x8200 +#define TOPDOWN_BE_BOUND 0x8300 + +static bool is_topdown_metric_event(struct evsel *counter) +{ + if (!counter->pmu_name) + return false; + + if (strcmp(counter->pmu_name, "cpu")) + return false; + + if ((counter->core.attr.config == TOPDOWN_RETIRE) || + (counter->core.attr.config == TOPDOWN_BAD_SPEC) || + (counter->core.attr.config == TOPDOWN_FE_BOUND) || + (counter->core.attr.config == TOPDOWN_BE_BOUND)) + return true; + + return false; +} + +static bool is_topdown_slots_event(struct evsel *counter) +{ + if (!counter->pmu_name) + return false; + + if (strcmp(counter->pmu_name, "cpu")) + return false; + + if (counter->core.attr.config == TOPDOWN_SLOTS) + return true; + + return false; +} + +static bool topdown_check_group_member(void) +{ + struct evsel *counter, *leader, *member; + bool has_slots; + + if (!pmu_have_event("cpu", topdown_metric_attrs[0])) + return true; + + evlist__for_each_entry(evsel_list, counter) { + if (!is_topdown_metric_event(counter)) + continue; + + leader = counter->leader; + has_slots = false; + + for_each_group_evsel(member, leader) { + if (is_topdown_slots_event(member)) + has_slots = true; + counter = member; + } + + if (!has_slots) + return false; + } + + return true; +} + __weak bool arch_topdown_check_group(bool *warn) { *warn = false; @@ -2024,6 +2090,12 @@ int cmd_stat(int argc, const char **argv) (const char **) stat_usage, PARSE_OPT_STOP_AT_NON_OPTION); perf_stat__collect_metric_expr(evsel_list); + + if (!topdown_check_group_member()) { + fprintf(stderr, "Topdown group must include slots event\n"); + goto out; + } + perf_stat__init_shadow_stats(); if (stat_config.csv_sep) { -- 2.17.1
| |