From nobody Thu Nov 28 22:50:54 2024 Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3FB2013211A for ; Thu, 26 Sep 2024 14:49:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362167; cv=none; b=iR2x9jbJnHu2OojbFIJRVWVmk+MRnHSbe/kYn+hezyezTm/W4CvEmoCJcSHrek5jdXa513vveptZ2iRbHEi6Dm7pjcaki87Nq2sWAKFu2GPLuIXwiPI815TB264/lR3G/xPw4R2pwD9D6jfwnS7mV7xICZN+rZw6i7DTNeisIO0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362167; c=relaxed/simple; bh=T59FtaBY86PMiCH7EJYlnBRTlljfRvPixXiEQ8KdFI4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kwHOU0ZqHR2xHWkIyrryXTvmP7rFI78DoQdFcv8k6I4XfVf04XdAYig87MBws8P8I8YumbTNGeEmLlwcAYvZZwdz9LUIf1Zu5l5h0K41U/hUSP7hZ03HoApld5CTTQn5if5NMe0VfhwxcR35l2J1CQOvniLk9F22euPym93ww1s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=c/x1KeLH; arc=none smtp.client-ip=209.85.218.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="c/x1KeLH" Received: by mail-ej1-f50.google.com with SMTP id a640c23a62f3a-a8a7596b7dfso21324566b.0 for ; Thu, 26 Sep 2024 07:49:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1727362164; x=1727966964; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PeDBv7d+GfXWdLno5voRxsTBQAHukEhaW6k0Tlbpnk4=; b=c/x1KeLH4y5wYb5jMqLUHiwx2RfGGSIBm+apbZ3hb+eV2sU/KwpIztzXcvB0TzYiD5 Uudo1cJ2Ws+B0PnU1JFAtMTii52lLcJA4qu6hLqFp82CoAjWfiGdapMKj/wG1Zx4frhe RjN13jv8K3jGtWfUCgy+Q8RmGSB1Xhn1sXcwPbhu1gnUNCPCouRixtv37SMXtTotpP6V HdKj0ldaZFcDV1xyFeUq2YtHK4qFIObzRLo5hGutNr9bY4aYTTvP9VP4nxyh+qkLz6KW RXQV8mrQmwt+rIHiy4/nFIq2rshg2fXniBFlPVlXCL3p21y+3N6fUOUXvL/I1aIQ2txS EAYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727362164; x=1727966964; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PeDBv7d+GfXWdLno5voRxsTBQAHukEhaW6k0Tlbpnk4=; b=qriGNYhaKLBChGQEvSBgFip9BvXqtHWvFvwlYw4q06/u9HxowONrvm5Uqpf2+n2OYn TS9AaItMSa2DSsNfXW+zjoUvKygiQRu7I8pXFZI+dBiw2onkMDwzFLKiAvFrqVpHv6+O dHXOK+XBBXdmJWQTQO7EEdgF/ld7wd6B9KhyAXMLUffPy2sM9WCWeMp0ELd+Ysz2HH8T DIRuk6I04vh1JstAC7tSGOXo9PkYbeNJWiV2QJfgDK4qOOKdW6+Rjle7sS0r8SakhZyN Tg+r9mj68+0GE+ZwCxe+9VXeft1+/4NEQg8KhUbz/zccrnpzz7PFaU6xprz51fL0sXy1 2f9A== X-Forwarded-Encrypted: i=1; AJvYcCWnlEPV+u06MOTTJzXU6XK8JmGhN8VyfYMd7iBtx/B3jkk0YC/kcyZQ3L1dIS/vW2XTnnNxpdnHpZ9WxNo=@vger.kernel.org X-Gm-Message-State: AOJu0YwZAue1fwDSDM4hJRBlo5Ny4+5j+vFG0los3JNcY3uOfKXkgqeI majd2Wyoyaw6otZw/eFDNNjjx8ZBQ7N9F5XT0s8FFww4GV5E9kfWhR334vFDGDo= X-Google-Smtp-Source: AGHT+IGis2kElUiziJGkZXiQVioCl+fZdl9vBtBeJXPGl44mCOjDIn0BNl4qvl6+YvVRqDKz1j6mtg== X-Received: by 2002:a17:906:db06:b0:a8d:ee9:3888 with SMTP id a640c23a62f3a-a93b1679678mr295619666b.32.1727362163488; Thu, 26 Sep 2024 07:49:23 -0700 (PDT) Received: from localhost.localdomain ([89.47.253.130]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a93c294833asm5589966b.98.2024.09.26.07.49.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2024 07:49:22 -0700 (PDT) From: James Clark To: irogers@google.com, linux-perf-users@vger.kernel.org, kan.liang@linux.intel.com, ak@linux.intel.com, namhyung@kernel.org Cc: James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Weilin Wang , Dominique Martinet , Athira Rajeev , Yang Li , Colin Ian King , Yang Jihong , Howard Chu , Ze Gao , Yunseong Kim , Sun Haiyong , Jing Zhang , Yicong Yang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 1/7] perf evsel: Add alternate_hw_config and use in evsel__match Date: Thu, 26 Sep 2024 15:48:32 +0100 Message-Id: <20240926144851.245903-2-james.clark@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240926144851.245903-1-james.clark@linaro.org> References: <20240926144851.245903-1-james.clark@linaro.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Rogers There are cases where we want to match events like instructions and cycles with legacy hardware values, in particular in stat-shadow's hard coded metrics. An evsel's name isn't a good point of reference as it gets altered, strstr would be too imprecise and re-parsing the event from its name is silly. Instead, hold the legacy hardware event name, determined during parsing, in the evsel for this matching case. Inline evsel__match2 that is only used in builtin-diff. Acked-by: Namhyung Kim Signed-off-by: Ian Rogers Acked-by: Kan Liang Signed-off-by: James Clark --- tools/perf/builtin-diff.c | 6 ++-- tools/perf/util/evsel.c | 21 ++++++++++++ tools/perf/util/evsel.h | 19 ++--------- tools/perf/util/parse-events.c | 59 +++++++++++++++++++++------------- tools/perf/util/parse-events.h | 8 ++++- tools/perf/util/parse-events.y | 2 +- tools/perf/util/pmu.c | 6 +++- tools/perf/util/pmu.h | 2 +- 8 files changed, 77 insertions(+), 46 deletions(-) diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 23326dd20333..82fb7773e03e 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -469,13 +469,13 @@ static int diff__process_sample_event(const struct pe= rf_tool *tool, =20 static struct perf_diff pdiff; =20 -static struct evsel *evsel_match(struct evsel *evsel, - struct evlist *evlist) +static struct evsel *evsel_match(struct evsel *evsel, struct evlist *evlis= t) { struct evsel *e; =20 evlist__for_each_entry(evlist, e) { - if (evsel__match2(evsel, e)) + if ((evsel->core.attr.type =3D=3D e->core.attr.type) && + (evsel->core.attr.config =3D=3D e->core.attr.config)) return e; } =20 diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index dbf9c8cee3c5..00178643b198 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -299,6 +299,7 @@ void evsel__init(struct evsel *evsel, evsel->pmu_name =3D NULL; evsel->group_pmu_name =3D NULL; evsel->skippable =3D false; + evsel->alternate_hw_config =3D PERF_COUNT_HW_MAX; } =20 struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx) @@ -445,6 +446,8 @@ struct evsel *evsel__clone(struct evsel *orig) if (evsel__copy_config_terms(evsel, orig) < 0) goto out_err; =20 + evsel->alternate_hw_config =3D orig->alternate_hw_config; + return evsel; =20 out_err: @@ -1845,6 +1848,24 @@ static int evsel__read_tool(struct evsel *evsel, int= cpu_map_idx, int thread) return 0; } =20 +bool __evsel__match(const struct evsel *evsel, u32 type, u64 config) +{ + + u32 e_type =3D evsel->core.attr.type; + u64 e_config =3D evsel->core.attr.config; + + if (e_type !=3D type) { + return type =3D=3D PERF_TYPE_HARDWARE && evsel->pmu && evsel->pmu->is_co= re && + evsel->alternate_hw_config =3D=3D config; + } + + if ((type =3D=3D PERF_TYPE_HARDWARE || type =3D=3D PERF_TYPE_HW_CACHE) && + perf_pmus__supports_extended_type()) + e_config &=3D PERF_HW_EVENT_MASK; + + return e_config =3D=3D config; +} + int evsel__read_counter(struct evsel *evsel, int cpu_map_idx, int thread) { if (evsel__is_tool(evsel)) diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 15e745a9a798..cf6f11fdfd06 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -102,6 +102,7 @@ struct evsel { int bpf_fd; struct bpf_object *bpf_obj; struct list_head config_terms; + u64 alternate_hw_config; }; =20 /* @@ -393,26 +394,10 @@ u64 format_field__intval(struct tep_format_field *fie= ld, struct perf_sample *sam struct tep_format_field *evsel__field(struct evsel *evsel, const char *nam= e); struct tep_format_field *evsel__common_field(struct evsel *evsel, const ch= ar *name); =20 -static inline bool __evsel__match(const struct evsel *evsel, u32 type, u64= config) -{ - if (evsel->core.attr.type !=3D type) - return false; - - if ((type =3D=3D PERF_TYPE_HARDWARE || type =3D=3D PERF_TYPE_HW_CACHE) && - perf_pmus__supports_extended_type()) - return (evsel->core.attr.config & PERF_HW_EVENT_MASK) =3D=3D config; - - return evsel->core.attr.config =3D=3D config; -} +bool __evsel__match(const struct evsel *evsel, u32 type, u64 config); =20 #define evsel__match(evsel, t, c) __evsel__match(evsel, PERF_TYPE_##t, PER= F_COUNT_##c) =20 -static inline bool evsel__match2(struct evsel *e1, struct evsel *e2) -{ - return (e1->core.attr.type =3D=3D e2->core.attr.type) && - (e1->core.attr.config =3D=3D e2->core.attr.config); -} - int evsel__read_counter(struct evsel *evsel, int cpu_map_idx, int thread); =20 int __evsel__read_on_cpu(struct evsel *evsel, int cpu_map_idx, int thread,= bool scale); diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 9a8be1e46d67..fcc4dab618be 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -228,7 +228,7 @@ __add_event(struct list_head *list, int *idx, bool init_attr, const char *name, const char *metric_id, struct perf_pmu *pmu, struct list_head *config_terms, bool auto_merge_stats, - struct perf_cpu_map *cpu_list) + struct perf_cpu_map *cpu_list, u64 alternate_hw_config) { struct evsel *evsel; struct perf_cpu_map *cpus =3D perf_cpu_map__is_empty(cpu_list) && pmu ? p= mu->cpus : cpu_list; @@ -264,6 +264,7 @@ __add_event(struct list_head *list, int *idx, evsel->auto_merge_stats =3D auto_merge_stats; evsel->pmu =3D pmu; evsel->pmu_name =3D pmu ? strdup(pmu->name) : NULL; + evsel->alternate_hw_config =3D alternate_hw_config; =20 if (name) evsel->name =3D strdup(name); @@ -286,16 +287,19 @@ struct evsel *parse_events__add_event(int idx, struct= perf_event_attr *attr, { return __add_event(/*list=3D*/NULL, &idx, attr, /*init_attr=3D*/false, na= me, metric_id, pmu, /*config_terms=3D*/NULL, - /*auto_merge_stats=3D*/false, /*cpu_list=3D*/NULL); + /*auto_merge_stats=3D*/false, /*cpu_list=3D*/NULL, + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX); } =20 static int add_event(struct list_head *list, int *idx, struct perf_event_attr *attr, const char *name, - const char *metric_id, struct list_head *config_terms) + const char *metric_id, struct list_head *config_terms, + u64 alternate_hw_config) { return __add_event(list, idx, attr, /*init_attr*/true, name, metric_id, /*pmu=3D*/NULL, config_terms, - /*auto_merge_stats=3D*/false, /*cpu_list=3D*/NULL) ? 0 : -ENOMEM; + /*auto_merge_stats=3D*/false, /*cpu_list=3D*/NULL, + alternate_hw_config) ? 0 : -ENOMEM; } =20 static int add_event_tool(struct list_head *list, int *idx, @@ -315,7 +319,8 @@ static int add_event_tool(struct list_head *list, int *= idx, evsel =3D __add_event(list, idx, &attr, /*init_attr=3D*/true, /*name=3D*/= NULL, /*metric_id=3D*/NULL, /*pmu=3D*/NULL, /*config_terms=3D*/NULL, /*auto_merge_stats=3D*/false, - cpu_list); + cpu_list, + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX); perf_cpu_map__put(cpu_list); if (!evsel) return -ENOMEM; @@ -450,7 +455,7 @@ bool parse_events__filter_pmu(const struct parse_events= _state *parse_state, static int parse_events_add_pmu(struct parse_events_state *parse_state, struct list_head *list, struct perf_pmu *pmu, const struct parse_events_terms *const_parsed_terms, - bool auto_merge_stats); + bool auto_merge_stats, u64 alternate_hw_config); =20 int parse_events_add_cache(struct list_head *list, int *idx, const char *n= ame, struct parse_events_state *parse_state, @@ -476,7 +481,8 @@ int parse_events_add_cache(struct list_head *list, int = *idx, const char *name, */ ret =3D parse_events_add_pmu(parse_state, list, pmu, parsed_terms, - perf_pmu__auto_merge_stats(pmu)); + perf_pmu__auto_merge_stats(pmu), + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX); if (ret) return ret; continue; @@ -507,7 +513,8 @@ int parse_events_add_cache(struct list_head *list, int = *idx, const char *name, =20 if (__add_event(list, idx, &attr, /*init_attr*/true, config_name ?: name, metric_id, pmu, &config_terms, /*auto_merge_stats=3D*/false, - /*cpu_list=3D*/NULL) =3D=3D NULL) + /*cpu_list=3D*/NULL, + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX) =3D=3D NULL) return -ENOMEM; =20 free_config_terms(&config_terms); @@ -772,7 +779,7 @@ int parse_events_add_breakpoint(struct parse_events_sta= te *parse_state, name =3D get_config_name(head_config); =20 return add_event(list, &parse_state->idx, &attr, name, /*mertic_id=3D*/NU= LL, - &config_terms); + &config_terms, /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX); } =20 static int check_type_val(struct parse_events_term *term, @@ -1072,6 +1079,7 @@ static int config_term_pmu(struct perf_event_attr *at= tr, if (perf_pmu__have_event(pmu, term->config)) { term->type_term =3D PARSE_EVENTS__TERM_TYPE_USER; term->no_value =3D true; + term->alternate_hw_config =3D true; } else { attr->type =3D PERF_TYPE_HARDWARE; attr->config =3D term->val.num; @@ -1384,8 +1392,9 @@ static int __parse_events_add_numeric(struct parse_ev= ents_state *parse_state, name =3D get_config_name(head_config); metric_id =3D get_config_metric_id(head_config); ret =3D __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, na= me, - metric_id, pmu, &config_terms, /*auto_merge_stats=3D*/false, - /*cpu_list=3D*/NULL) ? 0 : -ENOMEM; + metric_id, pmu, &config_terms, /*auto_merge_stats=3D*/false, + /*cpu_list=3D*/NULL, /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX + ) =3D=3D NULL ? -ENOMEM : 0; free_config_terms(&config_terms); return ret; } @@ -1443,7 +1452,7 @@ static bool config_term_percore(struct list_head *con= fig_terms) static int parse_events_add_pmu(struct parse_events_state *parse_state, struct list_head *list, struct perf_pmu *pmu, const struct parse_events_terms *const_parsed_terms, - bool auto_merge_stats) + bool auto_merge_stats, u64 alternate_hw_config) { struct perf_event_attr attr; struct perf_pmu_info info; @@ -1480,7 +1489,7 @@ static int parse_events_add_pmu(struct parse_events_s= tate *parse_state, /*init_attr=3D*/true, /*name=3D*/NULL, /*metric_id=3D*/NULL, pmu, /*config_terms=3D*/NULL, auto_merge_stats, - /*cpu_list=3D*/NULL); + /*cpu_list=3D*/NULL, alternate_hw_config); return evsel ? 0 : -ENOMEM; } =20 @@ -1501,7 +1510,8 @@ static int parse_events_add_pmu(struct parse_events_s= tate *parse_state, =20 /* Look for event names in the terms and rewrite into format based terms.= */ if (perf_pmu__check_alias(pmu, &parsed_terms, - &info, &alias_rewrote_terms, err)) { + &info, &alias_rewrote_terms, + &alternate_hw_config, err)) { parse_events_terms__exit(&parsed_terms); return -EINVAL; } @@ -1546,7 +1556,8 @@ static int parse_events_add_pmu(struct parse_events_s= tate *parse_state, evsel =3D __add_event(list, &parse_state->idx, &attr, /*init_attr=3D*/tru= e, get_config_name(&parsed_terms), get_config_metric_id(&parsed_terms), pmu, - &config_terms, auto_merge_stats, /*cpu_list=3D*/NULL); + &config_terms, auto_merge_stats, /*cpu_list=3D*/NULL, + alternate_hw_config); if (!evsel) { parse_events_terms__exit(&parsed_terms); return -ENOMEM; @@ -1567,7 +1578,7 @@ static int parse_events_add_pmu(struct parse_events_s= tate *parse_state, } =20 int parse_events_multi_pmu_add(struct parse_events_state *parse_state, - const char *event_name, + const char *event_name, u64 hw_config, const struct parse_events_terms *const_parsed_terms, struct list_head **listp, void *loc_) { @@ -1620,7 +1631,7 @@ int parse_events_multi_pmu_add(struct parse_events_st= ate *parse_state, =20 auto_merge_stats =3D perf_pmu__auto_merge_stats(pmu); if (!parse_events_add_pmu(parse_state, list, pmu, - &parsed_terms, auto_merge_stats)) { + &parsed_terms, auto_merge_stats, hw_config)) { struct strbuf sb; =20 strbuf_init(&sb, /*hint=3D*/ 0); @@ -1633,7 +1644,7 @@ int parse_events_multi_pmu_add(struct parse_events_st= ate *parse_state, =20 if (parse_state->fake_pmu) { if (!parse_events_add_pmu(parse_state, list, perf_pmus__fake_pmu(), &par= sed_terms, - /*auto_merge_stats=3D*/true)) { + /*auto_merge_stats=3D*/true, hw_config)) { struct strbuf sb; =20 strbuf_init(&sb, /*hint=3D*/ 0); @@ -1674,13 +1685,15 @@ int parse_events_multi_pmu_add_or_add_pmu(struct pa= rse_events_state *parse_state /* Attempt to add to list assuming event_or_pmu is a PMU name. */ pmu =3D perf_pmus__find(event_or_pmu); if (pmu && !parse_events_add_pmu(parse_state, *listp, pmu, const_parsed_t= erms, - /*auto_merge_stats=3D*/false)) + /*auto_merge_stats=3D*/false, + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX)) return 0; =20 if (parse_state->fake_pmu) { if (!parse_events_add_pmu(parse_state, *listp, perf_pmus__fake_pmu(), const_parsed_terms, - /*auto_merge_stats=3D*/false)) + /*auto_merge_stats=3D*/false, + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX)) return 0; } =20 @@ -1693,7 +1706,8 @@ int parse_events_multi_pmu_add_or_add_pmu(struct pars= e_events_state *parse_state =20 if (!parse_events_add_pmu(parse_state, *listp, pmu, const_parsed_terms, - auto_merge_stats)) { + auto_merge_stats, + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX)) { ok++; parse_state->wild_card_pmus =3D true; } @@ -1704,7 +1718,8 @@ int parse_events_multi_pmu_add_or_add_pmu(struct pars= e_events_state *parse_state =20 /* Failure to add, assume event_or_pmu is an event name. */ zfree(listp); - if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, const_parsed_t= erms, listp, loc)) + if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, PERF_COUNT_HW_= MAX, + const_parsed_terms, listp, loc)) return 0; =20 if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", event= _or_pmu) < 0) diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 10cc9c433116..2b52f8d6aa29 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -127,6 +127,12 @@ struct parse_events_term { * value is assumed to be 1. An event name also has no value. */ bool no_value; + /** + * @alternate_hw_config: config is the event name but num is an + * alternate PERF_TYPE_HARDWARE config value which is often nice for the + * sake of quick matching. + */ + bool alternate_hw_config; }; =20 struct parse_events_error { @@ -238,7 +244,7 @@ struct evsel *parse_events__add_event(int idx, struct p= erf_event_attr *attr, struct perf_pmu *pmu); =20 int parse_events_multi_pmu_add(struct parse_events_state *parse_state, - const char *event_name, + const char *event_name, u64 hw_config, const struct parse_events_terms *const_parsed_terms, struct list_head **listp, void *loc); =20 diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index b3c51f06cbdc..dcf47fabdfdd 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -292,7 +292,7 @@ PE_NAME sep_dc struct list_head *list; int err; =20 - err =3D parse_events_multi_pmu_add(_parse_state, $1, NULL, &list, &@1); + err =3D parse_events_multi_pmu_add(_parse_state, $1, PERF_COUNT_HW_MAX, N= ULL, &list, &@1); if (err < 0) { struct parse_events_state *parse_state =3D _parse_state; struct parse_events_error *error =3D parse_state->error; diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 61bdda01a05a..e32d601b48f1 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1606,7 +1606,7 @@ static int check_info_data(struct perf_pmu *pmu, */ int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms = *head_terms, struct perf_pmu_info *info, bool *rewrote_terms, - struct parse_events_error *err) + u64 *alternate_hw_config, struct parse_events_error *err) { struct parse_events_term *term, *h; struct perf_pmu_alias *alias; @@ -1638,6 +1638,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struc= t parse_events_terms *head_ NULL); return ret; } + *rewrote_terms =3D true; ret =3D check_info_data(pmu, alias, info, err, term->err_term); if (ret) @@ -1646,6 +1647,9 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struc= t parse_events_terms *head_ if (alias->per_pkg) info->per_pkg =3D true; =20 + if (term->alternate_hw_config) + *alternate_hw_config =3D term->val.num; + list_del_init(&term->list); parse_events_term__delete(term); } diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 4397c48ad569..f4271395c374 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -215,7 +215,7 @@ __u64 perf_pmu__format_bits(struct perf_pmu *pmu, const= char *name); int perf_pmu__format_type(struct perf_pmu *pmu, const char *name); int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms = *head_terms, struct perf_pmu_info *info, bool *rewrote_terms, - struct parse_events_error *err); + u64 *alternate_hw_config, struct parse_events_error *err); int perf_pmu__find_event(struct perf_pmu *pmu, const char *event, void *st= ate, pmu_event_callback cb); =20 void perf_pmu_format__set_value(void *format, int config, unsigned long *b= its); --=20 2.34.1 From nobody Thu Nov 28 22:50:54 2024 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1A08C13211A for ; Thu, 26 Sep 2024 14:49:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362181; cv=none; b=NpJLt3TW+AIRXQXg40t9I+nXEBE/SJOHuYfWp6Sc6/HmcLkQVhVX5dizfgLTRTyPhztLo9BNdtajOJv8xtDcbBdn1Td0K86MZGVZzXqGs9expPMZpld+dN97RV7ImPXzssxMjqe+isEu8Whd1PJDf4qFZ3pHuPqz64KF1IOvHqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362181; c=relaxed/simple; bh=7bH55AtzDDvrgdScJ0/zLYbggvv/3DW4lwZHwa0zpqs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=gnp2vVpIHoIzgqV6lIEUnyOzgDCnVRADEHWvlQDSYzgjPOcCG5LEPZqFH5ihdb9U3I56MgzXca8+pmWQUaeDiMbrp6knd/aLnz5KSrzkkY599/NO/x7SQcuhG7FRHUe8KjW3ch3hu7k7GFxBLEd6HCH7dRhfsCiWqy+zzShfjk4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Sr/MYm8H; arc=none smtp.client-ip=209.85.218.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Sr/MYm8H" Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-a8d3cde1103so150281666b.2 for ; Thu, 26 Sep 2024 07:49:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1727362177; x=1727966977; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=f05PQzvOEJplO/uvLn+IJgwf9BEDklxbAmP9za94pBU=; b=Sr/MYm8HALZGIphMBaIQMFj4jjChDnYvPivu6HueCrfn8D1ORoHl7gn/1/KyRA4bOv EepW1a0q8A5YoPeplI76iqmSSECk5OYJkIdqykfAB1ViAv4yHTuxINvSDYR8m1mgt5US rZHFUbdwv0gDsgMcflTLz6ARReNA4mdNw2uigfjVC2DEMfZbeOQf4h1cCKaYupSu16fL xLuXwuYYqHnw44hrGJkIdV+Ws4Wltcjiq+m9Gqto4Hu44Ne0V2XefE3ayRihtiKRgJz3 vEhsjuGXInMKUaQLLjGZSOBnJNoDNutu2ajKP0eX4cLO8kewqSsg2M83Nu0ckxILNpm7 K6CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727362177; x=1727966977; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=f05PQzvOEJplO/uvLn+IJgwf9BEDklxbAmP9za94pBU=; b=ggn5cBggI+sIIzOWaJ5iTP0pYb8jgRTXjroXiZA+ckP6FOV85WoZHDI+R5mBx5gDXW xOvblZYMBlVw3HnbW3TSilJeQG7dai65Ic7ecGPYzvOiWxUehacs8j9CUYtG1CnXIUBi acEpGuJRKeQQy7UOY7P7V/3TgWprWzjTBcnivYTW0j5VN9bvpbmifDRB4HR4g9NmKr+V l5oZPA1GVG8wsl5L3LHZjAlIRJsOYUnY0NOTH0mPlY4ebXbN25m3ZY8MJswRVeUQEgQC 5/F+pf/3PyTXeJga6ak9sxjz7yv3bymreuulFhs//i5FCRMMqFn3yf4O/wRQHxb/CF2E rWqQ== X-Forwarded-Encrypted: i=1; AJvYcCXdmum2/fobFFjJZMlgZMknXS8LBXPTBv5BMhCdpR5WyPiKnUX4pNvDapQqfR2Zl8Z2xlZ6xmMgps0+EsQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyBX8ifSIga1Qc/a9ze7nHTf71c7Cimd1WIKVxXVkGMFPuWzBY5 zddGbJK9BnZAKdJebdU93/Ikr3M+piet3z2HyMdGJe92GuLt+bzHcD3PFzAVXR4= X-Google-Smtp-Source: AGHT+IFRodAK6m711faN788Vx2f57SE2Mt+eHRET+Mxtap6zJn+GDJXAKEY/OXvNgmlfFR++fXsaNw== X-Received: by 2002:a17:907:7b91:b0:a86:a56a:3596 with SMTP id a640c23a62f3a-a93a06a43f4mr529239266b.60.1727362177193; Thu, 26 Sep 2024 07:49:37 -0700 (PDT) Received: from localhost.localdomain ([89.47.253.130]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a93c294833asm5589966b.98.2024.09.26.07.49.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2024 07:49:36 -0700 (PDT) From: James Clark To: irogers@google.com, linux-perf-users@vger.kernel.org, kan.liang@linux.intel.com, ak@linux.intel.com, namhyung@kernel.org Cc: James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Weilin Wang , Dominique Martinet , Athira Rajeev , Colin Ian King , Yang Li , Yang Jihong , Howard Chu , Ze Gao , Sun Haiyong , Jing Zhang , Yicong Yang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 2/7] perf stat: Uniquify event name improvements Date: Thu, 26 Sep 2024 15:48:33 +0100 Message-Id: <20240926144851.245903-3-james.clark@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240926144851.245903-1-james.clark@linaro.org> References: <20240926144851.245903-1-james.clark@linaro.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Rogers Without aggregation on Intel: ``` $ perf stat -e instructions,cycles ... ``` Will use "cycles" for the name of the legacy cycles event but as "instructions" has a sysfs name it will and a "[cpu]" PMU suffix. This often breaks things as the space between the event and the PMU name look like an extra column. The existing uniquify logic was also uniquifying in cases when all events are core and not with uncore events, it was not correctly handling modifiers, etc. Change the logic so that an initial pass that can disable uniquification is run. For individual counters, disable uniquification in more cases such as for consistency with legacy events or for libpfm4 events. Don't use the "[pmu]" style suffix in uniquification, always use "pmu/.../". Change how modifiers/terms are handled in the uniquification so that they look like parse-able events. This fixes "102: perf stat metrics (shadow stat) test:" that has been failing due to "instructions [cpu]" breaking its column/awk logic when values aren't aggregated. This started happening when instructions could match a sysfs rather than a legacy event, so the fixes tag reflects this. Fixes: 617824a7f0f7 ("perf parse-events: Prefer sysfs/JSON hardware events = over legacy") Acked-by: Namhyung Kim Signed-off-by: Ian Rogers [ Fix Intel TPEBS counting mode test ] Acked-by: Kan Liang Signed-off-by: James Clark --- .../perf/tests/shell/test_stat_intel_tpebs.sh | 11 +- tools/perf/util/stat-display.c | 101 ++++++++++++++---- 2 files changed, 85 insertions(+), 27 deletions(-) diff --git a/tools/perf/tests/shell/test_stat_intel_tpebs.sh b/tools/perf/t= ests/shell/test_stat_intel_tpebs.sh index c60b29add980..9a11f42d153c 100755 --- a/tools/perf/tests/shell/test_stat_intel_tpebs.sh +++ b/tools/perf/tests/shell/test_stat_intel_tpebs.sh @@ -8,12 +8,15 @@ grep -q GenuineIntel /proc/cpuinfo || { echo Skipping non= -Intel; exit 2; } # Use this event for testing because it should exist in all platforms event=3Dcache-misses:R =20 +# Hybrid platforms output like "cpu_atom/cache-misses/R", rather than as a= bove +alt_name=3D/cache-misses/R + # Without this cmd option, default value or zero is returned -echo "Testing without --record-tpebs" -result=3D$(perf stat -e "$event" true 2>&1) -[[ "$result" =3D~ $event ]] || exit 1 +#echo "Testing without --record-tpebs" +#result=3D$(perf stat -e "$event" true 2>&1) +#[[ "$result" =3D~ $event || "$result" =3D~ $alt_name ]] || exit 1 =20 # In platforms that do not support TPEBS, it should execute without error. echo "Testing with --record-tpebs" result=3D$(perf stat -e "$event" --record-tpebs -a sleep 0.01 2>&1) -[[ "$result" =3D~ "perf record" && "$result" =3D~ $event ]] || exit 1 +[[ "$result" =3D~ "perf record" && "$result" =3D~ $event || "$result" =3D~= $alt_name ]] || exit 1 diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index ea96e4ebad8c..cbff43ff8d0f 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -871,38 +871,66 @@ static void printout(struct perf_stat_config *config,= struct outstate *os, =20 static void uniquify_event_name(struct evsel *counter) { - char *new_name; - char *config; - int ret =3D 0; + const char *name, *pmu_name; + char *new_name, *config; + int ret; =20 - if (counter->uniquified_name || counter->use_config_name || - !counter->pmu_name || !strncmp(evsel__name(counter), counter->pmu_nam= e, - strlen(counter->pmu_name))) + /* The evsel was already uniquified. */ + if (counter->uniquified_name) return; =20 - config =3D strchr(counter->name, '/'); + /* Avoid checking to uniquify twice. */ + counter->uniquified_name =3D true; + + /* The evsel has a "name=3D" config term or is from libpfm. */ + if (counter->use_config_name || counter->is_libpfm_event) + return; + + /* Legacy no PMU event, don't uniquify. */ + if (!counter->pmu || + (counter->pmu->type < PERF_TYPE_MAX && counter->pmu->type !=3D PERF_= TYPE_RAW)) + return; + + /* A sysfs or json event replacing a legacy event, don't uniquify. */ + if (counter->pmu->is_core && counter->alternate_hw_config !=3D PERF_COUNT= _HW_MAX) + return; + + name =3D evsel__name(counter); + pmu_name =3D counter->pmu->name; + /* Already prefixed by the PMU name. */ + if (!strncmp(name, pmu_name, strlen(pmu_name))) + return; + + config =3D strchr(name, '/'); if (config) { - if (asprintf(&new_name, - "%s%s", counter->pmu_name, config) > 0) { - free(counter->name); - counter->name =3D new_name; - } - } else { - if (evsel__is_hybrid(counter)) { - ret =3D asprintf(&new_name, "%s/%s/", - counter->pmu_name, counter->name); + int len =3D config - name; + + if (config[1] =3D=3D '/') { + /* case: event// */ + ret =3D asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config += 2); } else { - ret =3D asprintf(&new_name, "%s [%s]", - counter->name, counter->pmu_name); + /* case: event/.../ */ + ret =3D asprintf(&new_name, "%s/%.*s,%s", pmu_name, len, name, config += 1); } + } else { + config =3D strchr(name, ':'); + if (config) { + /* case: event:.. */ + int len =3D config - name; =20 - if (ret) { - free(counter->name); - counter->name =3D new_name; + ret =3D asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config += 1); + } else { + /* case: event */ + ret =3D asprintf(&new_name, "%s/%s/", pmu_name, name); } } - - counter->uniquified_name =3D true; + if (ret > 0) { + free(counter->name); + counter->name =3D new_name; + } else { + /* ENOMEM from asprintf. */ + counter->uniquified_name =3D false; + } } =20 static bool hybrid_uniquify(struct evsel *evsel, struct perf_stat_config *= config) @@ -1559,6 +1587,31 @@ static void print_cgroup_counter(struct perf_stat_co= nfig *config, struct evlist print_metric_end(config, os); } =20 +static void disable_uniquify(struct evlist *evlist) +{ + struct evsel *counter; + struct perf_pmu *last_pmu =3D NULL; + bool first =3D true; + + evlist__for_each_entry(evlist, counter) { + /* If PMUs vary then uniquify can be useful. */ + if (!first && counter->pmu !=3D last_pmu) + return; + first =3D false; + if (counter->pmu) { + /* Allow uniquify for uncore PMUs. */ + if (!counter->pmu->is_core) + return; + /* Keep hybrid event names uniquified for clarity. */ + if (perf_pmus__num_core_pmus() > 1) + return; + } + } + evlist__for_each_entry_continue(evlist, counter) { + counter->uniquified_name =3D true; + } +} + void evlist__print_counters(struct evlist *evlist, struct perf_stat_config= *config, struct target *_target, struct timespec *ts, int argc, const char **argv) @@ -1572,6 +1625,8 @@ void evlist__print_counters(struct evlist *evlist, st= ruct perf_stat_config *conf .first =3D true, }; =20 + disable_uniquify(evlist); + if (config->iostat_run) evlist->selected =3D evlist__first(evlist); =20 --=20 2.34.1 From nobody Thu Nov 28 22:50:54 2024 Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BC9314B94B for ; Thu, 26 Sep 2024 14:49:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362195; cv=none; b=FspG0LEwEWH0xbOkeuYZ3SZeVyvVghf/eAthk8L2jgq1mUq6VFWCgRxvfkRULg2fMA/RxGhdcAYPRUuI+wP1mMvHugZFwptCoPZegcMegnxEHwCPNef8PgpXbFW+hrAAECvGuqjofqGN/MB47lQU5n1zdTAJKMfrEiiXF5XoPMo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362195; c=relaxed/simple; bh=hfsSqmslC/6uCAK3vgXzuhq4w/dBYRXXsmk1p1I1suA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GX9pxGngOR8k1VG2k14/+TAnBLN4JwmhQeV/1eeZfKUh1vG06wNbbhFZRpsKI8c/XSMNB0ZWu5zQw/Onv73wE6lJIZQyqJf5o7Q1szjX+HCYhTYmy4Xi8hoCRaKEM5VULgnGsK7anjCgYkTiSl35Ox7MhlwNIiW8lJbKwQViOBI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=kFkt1s7+; arc=none smtp.client-ip=209.85.218.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="kFkt1s7+" Received: by mail-ej1-f48.google.com with SMTP id a640c23a62f3a-a8d6d0fe021so178136766b.1 for ; Thu, 26 Sep 2024 07:49:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1727362191; x=1727966991; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5wfERK167Nh0WVnzPU8vdrYHJoiNRYC+RauRcM6FWGw=; b=kFkt1s7+29iiTe+aQWgZvYhsjUTHzGH82ZYLml0kSfT59aFUZckGrVudSqQajJ9UJh 3Jh2hz+rvi0IoQMrvBi2Qv4Ouapv6eD8wcua9q7/EGC0C26eN/MHg6bBOG7bM863URG2 OSEBgRKtVyZOpt69N5pRqD1yj1YZ0yC8BsEjXjabb7sC0aJeGY/Yw0CJqNACxkLA2LX+ 0lras0QE0TuW8qCBSC5DEIzz/dnCGN/dE3lUuolyxT01e9QOZj3hc3B0j4Vb9K8imkKD n2EdWFj3t6gUj6b3azRl5hJwfEKCMtQ9suZMSHoPJ5Vm1MieaYuFc4MLoFF78iUwmyIw yhrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727362191; x=1727966991; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5wfERK167Nh0WVnzPU8vdrYHJoiNRYC+RauRcM6FWGw=; b=poSlbXPoLZ1oPqUlfliFfOSBCCmDqrQadDpFO1aLC3XBLvd3/iJ+BRP9+O3jE32g3W Ih6Oxwl9cjrSmKxYx817Agzn44saWCW+Qtj3xH1nrf4DDnTWxDap4DkhinBv5o570L3o j2Oqc1CAnOyggqF0bSVUQBTSgcrl2ON2k06P4M8NHFpTnx3lt3XEIq7hPtKjGfL07ECu dduYwMXrOfG+6OBwz0w3TI1M1Msdj+UYlOS11wUx0H+XnD6Vmvqy2zCLd+n99B07gUBJ k+O0KyBttQUlFciK9D7x9D4J/K3uCIFs/a8GuY6C6RlYxMzXv3Pj57VSZJQw4SaswSZD X+sA== X-Forwarded-Encrypted: i=1; AJvYcCXBA4KyWf2WYaVV1Cny0Hcn0dat+vae91s2T4Yewrh71AnfneP3u58vI6PEHhH/oLcjd0SblK0leXm2fPk=@vger.kernel.org X-Gm-Message-State: AOJu0Yxaa/gPHqP0tiytpu3kHcTGy4tRfEnfiqnayCBtonelKNrSu+LH jfgzmBTQhPy6CGe6wRp9urs4DGfz6q1A5WhzX+4VQwZTgOTnDy6tKN6dc98a+Sg= X-Google-Smtp-Source: AGHT+IEv2rGgMWoE964CvdhvkVS1gKL0S6EsxEvLDW9BNDl3wLsCim7Nn9PzE2he1vpZgLT7/cwoJQ== X-Received: by 2002:a17:907:f1c7:b0:a8d:2c00:949a with SMTP id a640c23a62f3a-a93a03269f2mr578061666b.9.1727362190672; Thu, 26 Sep 2024 07:49:50 -0700 (PDT) Received: from localhost.localdomain ([89.47.253.130]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a93c294833asm5589966b.98.2024.09.26.07.49.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2024 07:49:50 -0700 (PDT) From: James Clark To: irogers@google.com, linux-perf-users@vger.kernel.org, kan.liang@linux.intel.com, ak@linux.intel.com, namhyung@kernel.org Cc: James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Weilin Wang , Dominique Martinet , Yang Li , Athira Rajeev , Colin Ian King , Yang Jihong , Howard Chu , Ze Gao , Jing Zhang , Sun Haiyong , Yicong Yang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 3/7] perf stat: Remove evlist__add_default_attrs use strings Date: Thu, 26 Sep 2024 15:48:34 +0100 Message-Id: <20240926144851.245903-4-james.clark@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240926144851.245903-1-james.clark@linaro.org> References: <20240926144851.245903-1-james.clark@linaro.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Rogers add_default_atttributes would add evsels by having pre-created perf_event_attr, however, this needed fixing for hybrid as the extended PMU type was necessary for each core PMU. The logic for this was in an arch specific x86 function and wasn't present for ARM, meaning that default events weren't being opened on all PMUs on ARM. Change the creation of the default events to use parse_events and strings as that will open the events on all PMUs. Rather than try to detect events on PMUs before parsing, parse the event but skip its output in stat-display. The previous order of hardware events was: cycles, stalled-cycles-frontend, stalled-cycles-backend, instructions. As instructions is a more fundamental concept the order is changed to: instructions, cycles, stalled-cycles-frontend, stalled-cycles-backend. Closes: https://lore.kernel.org/lkml/CAP-5=3DfVABSBZnsmtRn1uF-k-G1GWM-L5Sgi= inhPTfHbQsKXb_g@mail.gmail.com/ Acked-by: Namhyung Kim Signed-off-by: Ian Rogers [Don't display unsupported default events except 'cycles'] Acked-by: Kan Liang Signed-off-by: James Clark --- tools/perf/arch/x86/util/evlist.c | 74 +------- tools/perf/builtin-stat.c | 297 ++++++++++++------------------ tools/perf/util/evlist.c | 43 ----- tools/perf/util/evlist.h | 12 -- tools/perf/util/stat-display.c | 8 + tools/perf/util/stat-shadow.c | 4 +- 6 files changed, 131 insertions(+), 307 deletions(-) diff --git a/tools/perf/arch/x86/util/evlist.c b/tools/perf/arch/x86/util/e= vlist.c index cebdd483149e..3a4bf13b1759 100644 --- a/tools/perf/arch/x86/util/evlist.c +++ b/tools/perf/arch/x86/util/evlist.c @@ -1,78 +1,10 @@ // SPDX-License-Identifier: GPL-2.0 -#include -#include "util/pmu.h" -#include "util/pmus.h" -#include "util/evlist.h" -#include "util/parse-events.h" -#include "util/event.h" +#include +#include "../../../util/evlist.h" +#include "../../../util/evsel.h" #include "topdown.h" #include "evsel.h" =20 -static int ___evlist__add_default_attrs(struct evlist *evlist, - struct perf_event_attr *attrs, - size_t nr_attrs) -{ - LIST_HEAD(head); - size_t i =3D 0; - - for (i =3D 0; i < nr_attrs; i++) - event_attr_init(attrs + i); - - if (perf_pmus__num_core_pmus() =3D=3D 1) - return evlist__add_attrs(evlist, attrs, nr_attrs); - - for (i =3D 0; i < nr_attrs; i++) { - struct perf_pmu *pmu =3D NULL; - - if (attrs[i].type =3D=3D PERF_TYPE_SOFTWARE) { - struct evsel *evsel =3D evsel__new(attrs + i); - - if (evsel =3D=3D NULL) - goto out_delete_partial_list; - list_add_tail(&evsel->core.node, &head); - continue; - } - - while ((pmu =3D perf_pmus__scan_core(pmu)) !=3D NULL) { - struct perf_cpu_map *cpus; - struct evsel *evsel; - - evsel =3D evsel__new(attrs + i); - if (evsel =3D=3D NULL) - goto out_delete_partial_list; - evsel->core.attr.config |=3D (__u64)pmu->type << PERF_PMU_TYPE_SHIFT; - cpus =3D perf_cpu_map__get(pmu->cpus); - evsel->core.cpus =3D cpus; - evsel->core.own_cpus =3D perf_cpu_map__get(cpus); - evsel->pmu_name =3D strdup(pmu->name); - list_add_tail(&evsel->core.node, &head); - } - } - - evlist__splice_list_tail(evlist, &head); - - return 0; - -out_delete_partial_list: - { - struct evsel *evsel, *n; - - __evlist__for_each_entry_safe(&head, n, evsel) - evsel__delete(evsel); - } - return -1; -} - -int arch_evlist__add_default_attrs(struct evlist *evlist, - struct perf_event_attr *attrs, - size_t nr_attrs) -{ - if (!nr_attrs) - return 0; - - return ___evlist__add_default_attrs(evlist, attrs, nr_attrs); -} - int arch_evlist__cmp(const struct evsel *lhs, const struct evsel *rhs) { if (topdown_sys_has_perf_metrics() && diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 689a3d43c258..7b7cef1a2581 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1814,130 +1814,25 @@ static int perf_stat_init_aggr_mode_file(struct pe= rf_stat *st) } =20 /* - * Add default attributes, if there were no attributes specified or + * Add default events, if there were no attributes specified or * if -d/--detailed, -d -d or -d -d -d is used: */ -static int add_default_attributes(void) +static int add_default_events(void) { - struct perf_event_attr default_attrs0[] =3D { - - { .type =3D PERF_TYPE_SOFTWARE, .config =3D PERF_COUNT_SW_TASK_CLOCK }, - { .type =3D PERF_TYPE_SOFTWARE, .config =3D PERF_COUNT_SW_CONTEXT_SWITCH= ES }, - { .type =3D PERF_TYPE_SOFTWARE, .config =3D PERF_COUNT_SW_CPU_MIGRATIONS= }, - { .type =3D PERF_TYPE_SOFTWARE, .config =3D PERF_COUNT_SW_PAGE_FAULTS }, - - { .type =3D PERF_TYPE_HARDWARE, .config =3D PERF_COUNT_HW_CPU_CYCLES }, -}; - struct perf_event_attr frontend_attrs[] =3D { - { .type =3D PERF_TYPE_HARDWARE, .config =3D PERF_COUNT_HW_STALLED_CYCLES= _FRONTEND }, -}; - struct perf_event_attr backend_attrs[] =3D { - { .type =3D PERF_TYPE_HARDWARE, .config =3D PERF_COUNT_HW_STALLED_CYCLES= _BACKEND }, -}; - struct perf_event_attr default_attrs1[] =3D { - { .type =3D PERF_TYPE_HARDWARE, .config =3D PERF_COUNT_HW_INSTRUCTIONS = }, - { .type =3D PERF_TYPE_HARDWARE, .config =3D PERF_COUNT_HW_BRANCH_INSTRUC= TIONS }, - { .type =3D PERF_TYPE_HARDWARE, .config =3D PERF_COUNT_HW_BRANCH_MISSES = }, - -}; - -/* - * Detailed stats (-d), covering the L1 and last level data caches: - */ - struct perf_event_attr detailed_attrs[] =3D { - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_L1D << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_L1D << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_LL << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_LL << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) }, -}; - -/* - * Very detailed stats (-d -d), covering the instruction cache and the TLB= caches: - */ - struct perf_event_attr very_detailed_attrs[] =3D { - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_L1I << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_L1I << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_DTLB << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_DTLB << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_ITLB << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_ITLB << 0 | - (PERF_COUNT_HW_CACHE_OP_READ << 8) | - (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) }, - -}; + const char *pmu =3D parse_events_option_args.pmu_filter ?: "all"; + struct parse_events_error err; + struct evlist *evlist =3D evlist__new(); + struct evsel *evsel; + int ret =3D 0; =20 -/* - * Very, very detailed stats (-d -d -d), adding prefetch events: - */ - struct perf_event_attr very_very_detailed_attrs[] =3D { - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_L1D << 0 | - (PERF_COUNT_HW_CACHE_OP_PREFETCH << 8) | - (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16) }, - - { .type =3D PERF_TYPE_HW_CACHE, - .config =3D - PERF_COUNT_HW_CACHE_L1D << 0 | - (PERF_COUNT_HW_CACHE_OP_PREFETCH << 8) | - (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) }, -}; + if (!evlist) + return -ENOMEM; =20 - struct perf_event_attr default_null_attrs[] =3D {}; - const char *pmu =3D parse_events_option_args.pmu_filter ?: "all"; + parse_events_error__init(&err); =20 /* Set attrs if no event is selected and !null_run: */ if (stat_config.null_run) - return 0; + goto out; =20 if (transaction_run) { /* Handle -T as -M transaction. Once platform specific metrics @@ -1947,9 +1842,10 @@ static int add_default_attributes(void) */ if (!metricgroup__has_metric(pmu, "transaction")) { pr_err("Missing transaction metrics\n"); - return -1; + ret =3D -1; + goto out; } - return metricgroup__parse_groups(evsel_list, pmu, "transaction", + ret =3D metricgroup__parse_groups(evlist, pmu, "transaction", stat_config.metric_no_group, stat_config.metric_no_merge, stat_config.metric_no_threshold, @@ -1957,6 +1853,7 @@ static int add_default_attributes(void) stat_config.system_wide, stat_config.hardware_aware_grouping, &stat_config.metric_events); + goto out; } =20 if (smi_cost) { @@ -1964,26 +1861,29 @@ static int add_default_attributes(void) =20 if (sysfs__read_int(FREEZE_ON_SMI_PATH, &smi) < 0) { pr_err("freeze_on_smi is not supported.\n"); - return -1; + ret =3D -1; + goto out; } =20 if (!smi) { if (sysfs__write_int(FREEZE_ON_SMI_PATH, 1) < 0) { - fprintf(stderr, "Failed to set freeze_on_smi.\n"); - return -1; + pr_err("Failed to set freeze_on_smi.\n"); + ret =3D -1; + goto out; } smi_reset =3D true; } =20 if (!metricgroup__has_metric(pmu, "smi")) { pr_err("Missing smi metrics\n"); - return -1; + ret =3D -1; + goto out; } =20 if (!force_metric_only) stat_config.metric_only =3D true; =20 - return metricgroup__parse_groups(evsel_list, pmu, "smi", + ret =3D metricgroup__parse_groups(evlist, pmu, "smi", stat_config.metric_no_group, stat_config.metric_no_merge, stat_config.metric_no_threshold, @@ -1991,6 +1891,7 @@ static int add_default_attributes(void) stat_config.system_wide, stat_config.hardware_aware_grouping, &stat_config.metric_events); + goto out; } =20 if (topdown_run) { @@ -2003,21 +1904,23 @@ static int add_default_attributes(void) if (!max_level) { pr_err("Topdown requested but the topdown metric groups aren't present.= \n" "(See perf list the metric groups have names like TopdownL1)\n"); - return -1; + ret =3D -1; + goto out; } if (stat_config.topdown_level > max_level) { pr_err("Invalid top-down metrics level. The max level is %u.\n", max_le= vel); - return -1; - } else if (!stat_config.topdown_level) + ret =3D -1; + goto out; + } else if (!stat_config.topdown_level) { stat_config.topdown_level =3D 1; - + } if (!stat_config.interval && !stat_config.metric_only) { fprintf(stat_config.output, "Topdown accuracy may decrease when measuring long periods.\n" "Please print the result regularly, e.g. -I1000\n"); } str[8] =3D stat_config.topdown_level + '0'; - if (metricgroup__parse_groups(evsel_list, + if (metricgroup__parse_groups(evlist, pmu, str, /*metric_no_group=3D*/false, /*metric_no_merge=3D*/false, @@ -2025,41 +1928,49 @@ static int add_default_attributes(void) stat_config.user_requested_cpu_list, stat_config.system_wide, stat_config.hardware_aware_grouping, - &stat_config.metric_events) < 0) - return -1; + &stat_config.metric_events) < 0) { + ret =3D -1; + goto out; + } } =20 if (!stat_config.topdown_level) stat_config.topdown_level =3D 1; =20 - if (!evsel_list->core.nr_entries) { + if (!evlist->core.nr_entries && !evsel_list->core.nr_entries) { /* No events so add defaults. */ if (target__has_cpu(&target)) - default_attrs0[0].config =3D PERF_COUNT_SW_CPU_CLOCK; + ret =3D parse_events(evlist, "cpu-clock", &err); + else + ret =3D parse_events(evlist, "task-clock", &err); + if (ret) + goto out; + + ret =3D parse_events(evlist, + "context-switches," + "cpu-migrations," + "page-faults," + "instructions," + "cycles," + "stalled-cycles-frontend," + "stalled-cycles-backend," + "branches," + "branch-misses", + &err); + if (ret) + goto out; =20 - if (evlist__add_default_attrs(evsel_list, default_attrs0) < 0) - return -1; - if (perf_pmus__have_event("cpu", "stalled-cycles-frontend")) { - if (evlist__add_default_attrs(evsel_list, frontend_attrs) < 0) - return -1; - } - if (perf_pmus__have_event("cpu", "stalled-cycles-backend")) { - if (evlist__add_default_attrs(evsel_list, backend_attrs) < 0) - return -1; - } - if (evlist__add_default_attrs(evsel_list, default_attrs1) < 0) - return -1; /* * Add TopdownL1 metrics if they exist. To minimize * multiplexing, don't request threshold computation. */ if (metricgroup__has_metric(pmu, "Default")) { struct evlist *metric_evlist =3D evlist__new(); - struct evsel *metric_evsel; - - if (!metric_evlist) - return -1; =20 + if (!metric_evlist) { + ret =3D -ENOMEM; + goto out; + } if (metricgroup__parse_groups(metric_evlist, pmu, "Default", /*metric_no_group=3D*/false, /*metric_no_merge=3D*/false, @@ -2067,43 +1978,71 @@ static int add_default_attributes(void) stat_config.user_requested_cpu_list, stat_config.system_wide, stat_config.hardware_aware_grouping, - &stat_config.metric_events) < 0) - return -1; - - evlist__for_each_entry(metric_evlist, metric_evsel) { - metric_evsel->skippable =3D true; - metric_evsel->default_metricgroup =3D true; + &stat_config.metric_events) < 0) { + ret =3D -1; + goto out; } - evlist__splice_list_tail(evsel_list, &metric_evlist->core.entries); + + evlist__for_each_entry(metric_evlist, evsel) + evsel->default_metricgroup =3D true; + + evlist__splice_list_tail(evlist, &metric_evlist->core.entries); evlist__delete(metric_evlist); } - - /* Platform specific attrs */ - if (evlist__add_default_attrs(evsel_list, default_null_attrs) < 0) - return -1; } =20 /* Detailed events get appended to the event list: */ =20 - if (detailed_run < 1) - return 0; - - /* Append detailed run extra attributes: */ - if (evlist__add_default_attrs(evsel_list, detailed_attrs) < 0) - return -1; - - if (detailed_run < 2) - return 0; - - /* Append very detailed run extra attributes: */ - if (evlist__add_default_attrs(evsel_list, very_detailed_attrs) < 0) - return -1; - - if (detailed_run < 3) - return 0; - - /* Append very, very detailed run extra attributes: */ - return evlist__add_default_attrs(evsel_list, very_very_detailed_attrs); + if (!ret && detailed_run >=3D 1) { + /* + * Detailed stats (-d), covering the L1 and last level data + * caches: + */ + ret =3D parse_events(evlist, + "L1-dcache-loads," + "L1-dcache-load-misses," + "LLC-loads," + "LLC-load-misses", + &err); + } + if (!ret && detailed_run >=3D 2) { + /* + * Very detailed stats (-d -d), covering the instruction cache + * and the TLB caches: + */ + ret =3D parse_events(evlist, + "L1-icache-loads," + "L1-icache-load-misses," + "dTLB-loads," + "dTLB-load-misses," + "iTLB-loads," + "iTLB-load-misses", + &err); + } + if (!ret && detailed_run >=3D 3) { + /* + * Very, very detailed stats (-d -d -d), adding prefetch events: + */ + ret =3D parse_events(evlist, + "L1-dcache-prefetches," + "L1-dcache-prefetch-misses", + &err); + } +out: + if (!ret) { + evlist__for_each_entry(evlist, evsel) { + /* + * Make at least one event non-skippable so fatal errors are visible. + * 'cycles' always used to be default and non-skippable, so use that. + */ + if (strcmp("cycles", evsel__name(evsel))) + evsel->skippable =3D true; + } + } + parse_events_error__exit(&err); + evlist__splice_list_tail(evsel_list, &evlist->core.entries); + evlist__delete(evlist); + return ret; } =20 static const char * const stat_record_usage[] =3D { @@ -2760,7 +2699,7 @@ int cmd_stat(int argc, const char **argv) } } =20 - if (add_default_attributes()) + if (add_default_events()) goto out; =20 if (stat_config.cgroup_list) { diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index f14b7e6ff1dc..bace277fa77d 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -319,49 +319,6 @@ struct evsel *evlist__add_sched_switch(struct evlist *= evlist, bool system_wide) } #endif =20 -int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs= , size_t nr_attrs) -{ - struct evsel *evsel, *n; - LIST_HEAD(head); - size_t i; - - for (i =3D 0; i < nr_attrs; i++) { - evsel =3D evsel__new_idx(attrs + i, evlist->core.nr_entries + i); - if (evsel =3D=3D NULL) - goto out_delete_partial_list; - list_add_tail(&evsel->core.node, &head); - } - - evlist__splice_list_tail(evlist, &head); - - return 0; - -out_delete_partial_list: - __evlist__for_each_entry_safe(&head, n, evsel) - evsel__delete(evsel); - return -1; -} - -int __evlist__add_default_attrs(struct evlist *evlist, struct perf_event_a= ttr *attrs, size_t nr_attrs) -{ - size_t i; - - for (i =3D 0; i < nr_attrs; i++) - event_attr_init(attrs + i); - - return evlist__add_attrs(evlist, attrs, nr_attrs); -} - -__weak int arch_evlist__add_default_attrs(struct evlist *evlist, - struct perf_event_attr *attrs, - size_t nr_attrs) -{ - if (!nr_attrs) - return 0; - - return __evlist__add_default_attrs(evlist, attrs, nr_attrs); -} - struct evsel *evlist__find_tracepoint_by_id(struct evlist *evlist, int id) { struct evsel *evsel; diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index bcc1c6984bb5..371dc740ff7a 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -102,18 +102,6 @@ void evlist__delete(struct evlist *evlist); void evlist__add(struct evlist *evlist, struct evsel *entry); void evlist__remove(struct evlist *evlist, struct evsel *evsel); =20 -int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs= , size_t nr_attrs); - -int __evlist__add_default_attrs(struct evlist *evlist, - struct perf_event_attr *attrs, size_t nr_attrs); - -int arch_evlist__add_default_attrs(struct evlist *evlist, - struct perf_event_attr *attrs, - size_t nr_attrs); - -#define evlist__add_default_attrs(evlist, array) \ - arch_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array)) - int arch_evlist__cmp(const struct evsel *lhs, const struct evsel *rhs); =20 int evlist__add_dummy(struct evlist *evlist); diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index cbff43ff8d0f..5402998881c4 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -7,6 +7,7 @@ #include #include "color.h" #include "counts.h" +#include "debug.h" #include "evlist.h" #include "evsel.h" #include "stat.h" @@ -967,6 +968,13 @@ static bool should_skip_zero_counter(struct perf_stat_= config *config, struct perf_cpu cpu; int idx; =20 + /* + * Skip unsupported default events when not verbose. (default events + * are all marked 'skippable'). + */ + if (verbose =3D=3D 0 && counter->skippable && !counter->supported) + return true; + /* * Skip value 0 when enabling --per-thread globally, * otherwise it will have too many 0 output. diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index 99376c12dd8e..dd709a731574 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -76,7 +76,7 @@ void perf_stat__reset_shadow_stats(void) memset(&ru_stats, 0, sizeof(ru_stats)); } =20 -static enum stat_type evsel__stat_type(const struct evsel *evsel) +static enum stat_type evsel__stat_type(struct evsel *evsel) { /* Fake perf_hw_cache_op_id values for use with evsel__match. */ u64 PERF_COUNT_hw_cache_l1d_miss =3D PERF_COUNT_HW_CACHE_L1D | @@ -152,7 +152,7 @@ static const char *get_ratio_color(const double ratios[= 3], double val) =20 static double find_stat(const struct evsel *evsel, int aggr_idx, enum stat= _type type) { - const struct evsel *cur; + struct evsel *cur; int evsel_ctx =3D evsel_context(evsel); =20 evlist__for_each_entry(evsel->evlist, cur) { --=20 2.34.1 From nobody Thu Nov 28 22:50:54 2024 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09424146A7A for ; Thu, 26 Sep 2024 14:50:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362207; cv=none; b=qGHED+zDzMmkjtz0SzgmBOiHwStckiGsI3G61WG7oORmmbBB7/8AOtvRNtvM6xekL42Ll+B9mJjME6uoxz2BqTS16hsZPC/VGPaJTAwBJF7GyqmOf+XpianyuhNgtUNHhvSLAcYmmauoayfU161ajOggeNFK1u0d4FD/pK+Nwhc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362207; c=relaxed/simple; bh=PTT83CDGzF8j6RDNmUZnZvh4vgTyoBRmwdV2VAH/O8E=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NGoZtZnpzcQJQHJlT/HNtH0CNTAdm8JLKRyGWoyiPM0zCnliDXNOygoXRR1O7RGPDJPthFolYUT5Mu3mPBerGyyjXdKBZ+SynQtiP8wObn7QbMXxCOzN1N3GaSlSBuKj+pxQjFz2LIymf8GfEwwEQk+liIUjdAXmNeTJ2SBY5vA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=no/stc4j; arc=none smtp.client-ip=209.85.208.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="no/stc4j" Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-5c5cf26b95aso1190035a12.3 for ; Thu, 26 Sep 2024 07:50:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1727362204; x=1727967004; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AWSJTlcUZqJc1Q72aDywG6mEPNHoFW3+x51bKeYfGjU=; b=no/stc4jrzFfEWnJo6neUiNZRYxO1t+4SJZXpQxsRLQE+h2de1z5oE7Q7YmSOZQuc2 zHxrKnuzQjLFrL0jgd0FQEcqsbjkPwYss0BO1H4hwQ14Nyd855bUZ8iIPVTxhwaPcTGM JqTGzHRmExfbRWGSq6Z+RwfTaHoDN5oIMQREiDVUlxnVwmH0PUB2zNWlBV9zxZHOy3u0 0nW3M5CugqO0HpQVH0azWRZ1R0qvxOlpDKr45uXp4gb7atDnQKHvpv8kIF66jCpWEI+M lFweolblun8FI3sJ4wnH3U4+ENZY9LZuVMbB+VZTufCUeEfZWtMVXEu5+SePvC5AKmL2 4QHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727362204; x=1727967004; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AWSJTlcUZqJc1Q72aDywG6mEPNHoFW3+x51bKeYfGjU=; b=rUfDayp5JtI+ybypzwb68+1KNoSLEHRyLDK4p6xqaOe7dnG3qgCAF3n8/9qqaAJliC 4wBJ19m2ZgqAwsdcYDhht0UtgyLUHXoHpt7ZRt7oZe1w5uM+Y1dJVFPLrEou4lL4LN95 5QUs8bZEqlVvvENWrf3XuTERIGej4vah0UXWS8280pB/FJPiJL5EjEteDMeKltFjT0AM 9jONAosHp1rPnHoVM70v/aA/eXmHlXbHR0JNQTdJVHBXfTVIU4ZBA5pNGeKq0UDluFk9 G9M7DAKHSgez08ytvcduB7uscYj2niY50+t1K9D3LruJWNyO0mHEeqFwYcbtoGyRpLxA IO8g== X-Forwarded-Encrypted: i=1; AJvYcCWImi6i3LLAg+CQZm0EsO15/t0K1/gj2GErTlbQ8QR6Rwr2bjEHK8CyhkT4V7/qGwbT/0qex5kw2iIKb/Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwmRmTvq32OsAXqomHSS4ulsPhSKjdBr50DxtFjJJvzDKVdTX4A oyIl+l6EFFpd7bm0049QCqyPkoOrn1JyPIRFKOgGK49uG9Gp/uCFupVDkWBiNbg= X-Google-Smtp-Source: AGHT+IFVb7sSRn39qxyC7VnF93ZMoZ0TZHVjg1NjGZKl+w/BNqbLDXtVjbZLiCJ0Q6lmV8piIlggjA== X-Received: by 2002:a17:906:dc8f:b0:a86:83f8:f5a2 with SMTP id a640c23a62f3a-a93a038c991mr608744466b.19.1727362204313; Thu, 26 Sep 2024 07:50:04 -0700 (PDT) Received: from localhost.localdomain ([89.47.253.130]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a93c294833asm5589966b.98.2024.09.26.07.50.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2024 07:50:03 -0700 (PDT) From: James Clark To: irogers@google.com, linux-perf-users@vger.kernel.org, kan.liang@linux.intel.com, ak@linux.intel.com, namhyung@kernel.org Cc: James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Weilin Wang , Dominique Martinet , Athira Rajeev , Yang Jihong , Colin Ian King , Howard Chu , Ze Gao , Yunseong Kim , Sun Haiyong , Jing Zhang , Yicong Yang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 4/7] perf evsel x86: Make evsel__has_perf_metrics work for legacy events Date: Thu, 26 Sep 2024 15:48:35 +0100 Message-Id: <20240926144851.245903-5-james.clark@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240926144851.245903-1-james.clark@linaro.org> References: <20240926144851.245903-1-james.clark@linaro.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Rogers Use PMU interface to better detect core PMU for legacy events. Look for slots event on core PMU if it is appropriate for the event. Acked-by: Namhyung Kim Signed-off-by: Ian Rogers Acked-by: Kan Liang Signed-off-by: James Clark --- tools/perf/arch/x86/util/evsel.c | 31 ++++++++++++++++++++++++++----- tools/perf/util/pmu.c | 2 +- tools/perf/util/pmu.h | 1 + 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/tools/perf/arch/x86/util/evsel.c b/tools/perf/arch/x86/util/ev= sel.c index 090d0f371891..ec2ac3bbb76f 100644 --- a/tools/perf/arch/x86/util/evsel.c +++ b/tools/perf/arch/x86/util/evsel.c @@ -21,7 +21,8 @@ void arch_evsel__set_sample_weight(struct evsel *evsel) /* Check whether the evsel's PMU supports the perf metrics */ bool evsel__sys_has_perf_metrics(const struct evsel *evsel) { - const char *pmu_name =3D evsel->pmu_name ? evsel->pmu_name : "cpu"; + struct perf_pmu *pmu; + u32 type =3D evsel->core.attr.type; =20 /* * The PERF_TYPE_RAW type is the core PMU type, e.g., "cpu" PMU @@ -31,11 +32,31 @@ bool evsel__sys_has_perf_metrics(const struct evsel *ev= sel) * Checking both the PERF_TYPE_RAW type and the slots event * should be good enough to detect the perf metrics feature. */ - if ((evsel->core.attr.type =3D=3D PERF_TYPE_RAW) && - perf_pmus__have_event(pmu_name, "slots")) - return true; +again: + switch (type) { + case PERF_TYPE_HARDWARE: + case PERF_TYPE_HW_CACHE: + type =3D evsel->core.attr.config >> PERF_PMU_TYPE_SHIFT; + if (type) + goto again; + break; + case PERF_TYPE_RAW: + break; + default: + return false; + } + + pmu =3D evsel->pmu; + if (pmu && perf_pmu__is_fake(pmu)) + pmu =3D NULL; =20 - return false; + if (!pmu) { + while ((pmu =3D perf_pmus__scan_core(pmu)) !=3D NULL) { + if (pmu->type =3D=3D PERF_TYPE_RAW) + break; + } + } + return pmu && perf_pmu__have_event(pmu, "slots"); } =20 bool arch_evsel__must_be_in_group(const struct evsel *evsel) diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index e32d601b48f1..8993b5853687 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1168,7 +1168,7 @@ struct perf_pmu *perf_pmu__create_placeholder_core_pm= u(struct list_head *core_pm return pmu; } =20 -static bool perf_pmu__is_fake(const struct perf_pmu *pmu) +bool perf_pmu__is_fake(const struct perf_pmu *pmu) { return pmu->type =3D=3D PERF_PMU_TYPE_FAKE; } diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index f4271395c374..d352d53b8d55 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -281,5 +281,6 @@ struct perf_pmu *perf_pmu__create_placeholder_core_pmu(= struct list_head *core_pm void perf_pmu__delete(struct perf_pmu *pmu); struct perf_pmu *perf_pmus__find_core_pmu(void); const char *perf_pmu__name_from_config(struct perf_pmu *pmu, u64 config); +bool perf_pmu__is_fake(const struct perf_pmu *pmu); =20 #endif /* __PMU_H */ --=20 2.34.1 From nobody Thu Nov 28 22:50:54 2024 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7742F14884F for ; Thu, 26 Sep 2024 14:50:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362222; cv=none; b=ikB5Lbi/9luj9hpLZZCzuHKOtt0p5HrTniKzYgiKZYKHNt5Qdxq4dId6wpL1NvKXmQztwOm8r7d1bF2K0o/ZstRty0fNygmIcoKSpmcZE81H4hlU2pqc61fz+toZQp9u9gc8VIORkgYd94XRP/E2ZUeXVzWj4d/P076F5BbpDoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362222; c=relaxed/simple; bh=zsbhin7qH/+OegtlGnCEJ8ZsxunfFeElrKWcIpdrONs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=T7BGLtsCSWpFsQVpzjoWSmparCuZCjdaX6vFddYxLCwXU1tlTSAmzDTeBCzN6OH9PIPKUcM2MeA6TK+7miMgdqLvDI6cYIbtKKy/e7+2Udndf/G22h7ylQD9pepx4Yxhgq7giJB/CweeMrG+8XP8bDZHuotnKn6cLg055zgaq/4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=PlJZsGCf; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="PlJZsGCf" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-53659867cbdso1780053e87.3 for ; Thu, 26 Sep 2024 07:50:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1727362218; x=1727967018; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Qp213y54GN91pnOwFQAxUfYd+2v8V8CzcBUreVn10hc=; b=PlJZsGCf7gpsGS5qWAAcuXqIxfT5pXLyR5g5I/mObG0mNc4G/Sgw/xU1Iiwc4A6Ord EAd5VBDkDKdDnrB/YdH6fPgq/93HPnKtw3BioniubmSlmTvliYyCgOjHtuvnhzVpTRGw adnPvEaTT5s9dn4IP7j3LP3eMIGrtSmuI43Twx6cwPIpQiXiQEo0Fs5Lyl2q2JpCIgX0 rjAptLs78fNQAw6MQxfa+Q6M5i34OTRvIgU2kiJkY5vio57V+WJ75W55aZTJw++40EdL wpJEMn5KXYKdZqYKwQeQvB+Y5ZeLo7BA9+PStGnYwLVP5QnOXw88TVtdDh+rfI5TiF2U eUpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727362218; x=1727967018; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Qp213y54GN91pnOwFQAxUfYd+2v8V8CzcBUreVn10hc=; b=RWm3pAx9zkIayCEtkSqyk7UKjThZf6GvRcNY1sxjJ2bM+LqgQICOlmInUsGZyNOw/t SylRdCWajxgOjYmIV4hlKfi0iRDDaZlZXcaDwIxcmVxHo3O7qR7rnYqChLKx0dMJVqnE C4B+siaKp1zvW8svRNK6V7co3w1HRovIP1mJ8XSlwc9wGJfT3kUD1dof8A4x6liPqmaq d0ceR0W1lZeDNoKOQktwrjikfvyEi+urNm0Tdv3THC5XVQZcqzqheTPckgUiKwwUpKEL HfZUblSRVM7zcy10QjtuLKqezol3bwnke2PWbxTXZIC8FSAgZLYrILn+OhPwudvVs2Ev q6Cg== X-Forwarded-Encrypted: i=1; AJvYcCUVzrajzLXNz+8L2XZKaCbfbGM8CgVlbLDYnCelTCkWVwoowNbIQXbXNS280CcbhC4t4huCoJBkLIxrxJI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz3vwcirVbFGSuXqISm0jIwqA+GsfFJqsS9I40sIYyn6m3M/eKK MRv7lrFMLrZpjj8WJLVZI8aUfAaniRaYqwq1V6XuITIkPGwYIEMQR/S+bCwadus= X-Google-Smtp-Source: AGHT+IG+DAUJo2pn2BJB0TGl+/A9x8WGEWnV2tuFf/gEyli81cL41CJgfK4r+z5lVCT/xKvYFOGJRQ== X-Received: by 2002:a05:6512:ace:b0:52c:76ac:329b with SMTP id 2adb3069b0e04-53877538b62mr6848029e87.35.1727362217510; Thu, 26 Sep 2024 07:50:17 -0700 (PDT) Received: from localhost.localdomain ([89.47.253.130]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a93c294833asm5589966b.98.2024.09.26.07.50.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2024 07:50:17 -0700 (PDT) From: James Clark To: irogers@google.com, linux-perf-users@vger.kernel.org, kan.liang@linux.intel.com, ak@linux.intel.com, namhyung@kernel.org Cc: James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Weilin Wang , Athira Rajeev , Dominique Martinet , Yang Jihong , Yang Li , Howard Chu , Ze Gao , Jing Zhang , Sun Haiyong , Yicong Yang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 5/7] perf evsel: Remove pmu_name Date: Thu, 26 Sep 2024 15:48:36 +0100 Message-Id: <20240926144851.245903-6-james.clark@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240926144851.245903-1-james.clark@linaro.org> References: <20240926144851.245903-1-james.clark@linaro.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Rogers "evsel->pmu_name" is only ever assigned a strdup of "pmu->name", a strdup of "evsel->pmu_name" or NULL. As such, prefer to use "pmu->name" directly and even to directly compare PMUs than PMU names. For safety, add some additional NULL tests. Acked-by: Namhyung Kim Signed-off-by: Ian Rogers [ Fix arm-spe.c usage of pmu_name and empty PMU name ] Acked-by: Kan Liang Signed-off-by: James Clark --- tools/perf/arch/arm64/util/arm-spe.c | 4 ++-- tools/perf/arch/x86/util/evsel.c | 4 ++-- tools/perf/tests/parse-events.c | 2 +- tools/perf/util/evlist.c | 3 ++- tools/perf/util/evsel.c | 7 ------- tools/perf/util/evsel.h | 3 +-- tools/perf/util/metricgroup.c | 4 ++-- tools/perf/util/parse-events.c | 1 - tools/perf/util/stat-shadow.c | 10 +++++----- tools/perf/util/stat.c | 2 +- 10 files changed, 16 insertions(+), 24 deletions(-) diff --git a/tools/perf/arch/arm64/util/arm-spe.c b/tools/perf/arch/arm64/u= til/arm-spe.c index 2be99fdf997d..59a85e6f3aa3 100644 --- a/tools/perf/arch/arm64/util/arm-spe.c +++ b/tools/perf/arch/arm64/util/arm-spe.c @@ -188,9 +188,9 @@ static int arm_spe_recording_options(struct auxtrace_re= cord *itr, =20 evlist__for_each_entry(evlist, evsel) { if (evsel__is_aux_event(evsel)) { - if (!strstarts(evsel->pmu_name, ARM_SPE_PMU_NAME)) { + if (!strstarts(evsel->pmu->name, ARM_SPE_PMU_NAME)) { pr_err("Found unexpected auxtrace event: %s\n", - evsel->pmu_name); + evsel->pmu->name); return -EINVAL; } opts->full_auxtrace =3D true; diff --git a/tools/perf/arch/x86/util/evsel.c b/tools/perf/arch/x86/util/ev= sel.c index ec2ac3bbb76f..cf7c116eeb8e 100644 --- a/tools/perf/arch/x86/util/evsel.c +++ b/tools/perf/arch/x86/util/evsel.c @@ -84,7 +84,7 @@ int arch_evsel__hw_name(struct evsel *evsel, char *bf, si= ze_t size) return scnprintf(bf, size, "%s", event_name); =20 return scnprintf(bf, size, "%s/%s/", - evsel->pmu_name ? evsel->pmu_name : "cpu", + evsel->pmu ? evsel->pmu->name : "cpu", event_name); } =20 @@ -129,7 +129,7 @@ int arch_evsel__open_strerror(struct evsel *evsel, char= *msg, size_t size) return 0; =20 if (!evsel->core.attr.precise_ip && - !(evsel->pmu_name && !strncmp(evsel->pmu_name, "ibs", 3))) + !(evsel->pmu && !strncmp(evsel->pmu->name, "ibs", 3))) return 0; =20 /* More verbose IBS errors. */ diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-event= s.c index 9e3086d02150..78e999f03d2d 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -730,7 +730,7 @@ static int test__checkevent_pmu_events(struct evlist *e= vlist) =20 TEST_ASSERT_VAL("wrong number of entries", 1 =3D=3D evlist->core.nr_entri= es); TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW =3D=3D evsel->core.attr.type = || - strcmp(evsel->pmu_name, "cpu")); + strcmp(evsel->pmu->name, "cpu")); TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index bace277fa77d..4835d5aa5c48 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -2576,7 +2576,8 @@ void evlist__uniquify_name(struct evlist *evlist) else attributes =3D empty_attributes; =20 - if (asprintf(&new_name, "%s/%s/%s", pos->pmu_name, pos->name, attributes= + 1)) { + if (asprintf(&new_name, "%s/%s/%s", pos->pmu ? pos->pmu->name : "", + pos->name, attributes + 1)) { free(pos->name); pos->name =3D new_name; } else { diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 00178643b198..56f3c2183437 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -296,7 +296,6 @@ void evsel__init(struct evsel *evsel, evsel->metric_events =3D NULL; evsel->per_pkg_mask =3D NULL; evsel->collect_stat =3D false; - evsel->pmu_name =3D NULL; evsel->group_pmu_name =3D NULL; evsel->skippable =3D false; evsel->alternate_hw_config =3D PERF_COUNT_HW_MAX; @@ -394,11 +393,6 @@ struct evsel *evsel__clone(struct evsel *orig) if (evsel->group_name =3D=3D NULL) goto out_err; } - if (orig->pmu_name) { - evsel->pmu_name =3D strdup(orig->pmu_name); - if (evsel->pmu_name =3D=3D NULL) - goto out_err; - } if (orig->group_pmu_name) { evsel->group_pmu_name =3D strdup(orig->group_pmu_name); if (evsel->group_pmu_name =3D=3D NULL) @@ -1497,7 +1491,6 @@ void evsel__exit(struct evsel *evsel) zfree(&evsel->group_name); zfree(&evsel->name); zfree(&evsel->filter); - zfree(&evsel->pmu_name); zfree(&evsel->group_pmu_name); zfree(&evsel->unit); zfree(&evsel->metric_id); diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index cf6f11fdfd06..3e751ea769ac 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -72,7 +72,6 @@ struct evsel { struct { char *name; char *group_name; - const char *pmu_name; const char *group_pmu_name; #ifdef HAVE_LIBTRACEEVENT struct tep_event *tp_format; @@ -184,7 +183,7 @@ struct evsel { unsigned long open_flags; int precise_ip_original; =20 - /* for missing_features */ + /* The PMU the event is from. Used for missing_features, PMU name, etc. */ struct perf_pmu *pmu; =20 /* For tool events */ diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 4dff3e925a47..9c6fa6b4f628 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -297,8 +297,8 @@ static int setup_metric_events(const char *pmu, struct = hashmap *ids, struct expr_id_data *val_ptr; =20 /* Don't match events for the wrong hybrid PMU. */ - if (!all_pmus && ev->pmu_name && evsel__is_hybrid(ev) && - strcmp(ev->pmu_name, pmu)) + if (!all_pmus && ev->pmu && evsel__is_hybrid(ev) && + strcmp(ev->pmu->name, pmu)) continue; /* * Check for duplicate events with the same name. For diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index fcc4dab618be..e96cf13dc396 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -263,7 +263,6 @@ __add_event(struct list_head *list, int *idx, evsel->core.is_pmu_core =3D pmu ? pmu->is_core : false; evsel->auto_merge_stats =3D auto_merge_stats; evsel->pmu =3D pmu; - evsel->pmu_name =3D pmu ? strdup(pmu->name) : NULL; evsel->alternate_hw_config =3D alternate_hw_config; =20 if (name) diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index dd709a731574..3ce756b8ede5 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -573,7 +573,7 @@ static void perf_stat__print_metricgroup_header(struct = perf_stat_config *config, { bool need_full_name =3D perf_pmus__num_core_pmus() > 1; static const char *last_name; - static const char *last_pmu; + static const struct perf_pmu *last_pmu; char full_name[64]; =20 /* @@ -584,21 +584,21 @@ static void perf_stat__print_metricgroup_header(struc= t perf_stat_config *config, * different metric events. */ if (last_name && !strcmp(last_name, name)) { - if (!need_full_name || !strcmp(last_pmu, evsel->pmu_name)) { + if (!need_full_name || last_pmu !=3D evsel->pmu) { out->print_metricgroup_header(config, ctxp, NULL); return; } } =20 - if (need_full_name) - scnprintf(full_name, sizeof(full_name), "%s (%s)", name, evsel->pmu_name= ); + if (need_full_name && evsel->pmu) + scnprintf(full_name, sizeof(full_name), "%s (%s)", name, evsel->pmu->nam= e); else scnprintf(full_name, sizeof(full_name), "%s", name); =20 out->print_metricgroup_header(config, ctxp, full_name); =20 last_name =3D name; - last_pmu =3D evsel->pmu_name; + last_pmu =3D evsel->pmu; } =20 /** diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 0bd5467389e4..7c2ccdcc3fdb 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -553,7 +553,7 @@ static bool evsel__is_alias(struct evsel *evsel_a, stru= ct evsel *evsel_b) if (evsel__is_clock(evsel_a) !=3D evsel__is_clock(evsel_b)) return false; =20 - return !!strcmp(evsel_a->pmu_name, evsel_b->pmu_name); + return evsel_a->pmu !=3D evsel_b->pmu; } =20 static void evsel__merge_aliases(struct evsel *evsel) --=20 2.34.1 From nobody Thu Nov 28 22:50:54 2024 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58976154439 for ; Thu, 26 Sep 2024 14:50:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362235; cv=none; b=Oxxug05uwFc9+rQYwMzfG+CeQYJ2G66r2Dp4l0oPBmnMh+AUR7fksNnD2qaWsOot8mPAucW8r/WggF7DIUPoU9IosLAw9j66jrHHmFaz2RlUXvE4+hxSqgIPH8waAEN8QlMA+uZD5OiW9DS3eQGbQYvQJxzf+U6dVwL8tAOVYcw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362235; c=relaxed/simple; bh=uEkMebtlJ3oS+pP2FKl25/DE83+yiPQjb4Lo5sy18SI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uw5HqqKGGUYfFTqQ+VODTc4mIwG7JqbS5d2ZNULnpKxhkbZ79GwVMlVbALEpqQn+6cXOL1pO0TVFeGzzQT/SPJ9I+6c7m07+ak6B3TcLPfN4Dw5EYBOFHQ9IckVwca3/VT/u0xOdfMPu9WzKXYM7EmKuHQkeRhcgOkCFTOeBlsM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=X1aVKkvT; arc=none smtp.client-ip=209.85.167.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="X1aVKkvT" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-5365aa568ceso1306132e87.0 for ; Thu, 26 Sep 2024 07:50:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1727362231; x=1727967031; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5C2IaRNsHC56vkJV7d2z1hySpqTijtSB8YUkIrjThBQ=; b=X1aVKkvTUJK7Eg8qiaPMZy6enfQKgnvDpUy64n5wEa0L5CUDmJ4IvdRWuDcgptoMD4 vKvdO7wwTbc3YgSg4afO3TtSKx/ZfP+KoHRV9c5Yft2PRRuDM5VpApPA7amvKmNmM3Ks pfwY8Hp2JaoYzKW3CuKeJ1F7ukSF3CbnC0CGw5qYMkfsZFshHxdOmvtp88ZHSXrEYUX7 WIO+r04nu2I9bi7uutLyn8IDO/fdC7/Zirs/dp9FQvNFz4fB8pMT3+6QkDcxOKRfUgg8 9bBdwesPhECaSY3CWWIsdCBjCMHPJB9pEPu1AWML8G6XeWlnd5eaatUGbK9yb54SG1Av 22sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727362231; x=1727967031; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5C2IaRNsHC56vkJV7d2z1hySpqTijtSB8YUkIrjThBQ=; b=xHQxnvw2qWNzQDWhT+aTcGTFYsp7abLckum5nBAag9pQGOY8TKtIO4cG65sIwmL2Bj g0tjGHwtNAfgCrLwLMn/6Aha5VLxWzN3Ax+u+kiaFjWnCdDOMi9XRLZldip1wACiGbTJ v/XHNqMjXg8gBul5DLZcsoD4Qr0T/hzaSoSZwAd91VhzVxpWx+HXMSQnNDgJkHYLL3Fs WFIFEukIKJigZ/KHC/kiPp8Q33zZmbJ4YrnuHTpUmqdakYefPRLpecow+MEbBv0cKkSh Sd8ESv5QjWFJJ3ugmXLnqjc7OVcUCwn0Ld2qxGqzWtUBWEo6vdU4VigBoO6eOr9UHuUi FzoQ== X-Forwarded-Encrypted: i=1; AJvYcCV3I27LWMvn5PIyr1qkgg2Z/IAu2wo5JROvDhMcroNnYMnlsuJbc+zQir7knOwfbiYQSGXNr90+mPSkdEk=@vger.kernel.org X-Gm-Message-State: AOJu0YxzCgMaVxoFhsLMWSfo7MJMVvhDlhGh+rGqYn7OmHG1CdcMlLnD fQKZdjWDEEXoG88Dn8vbvcXQ6LHis+8kAzOl5o/XDbFABUHZPiLepgpnvLZSb6k= X-Google-Smtp-Source: AGHT+IHFBhIAAGgVt9IOOCYfDDIgsohl3GTjfp4I7Y73RftEYhJ7VTnhJZmj1Oc2A4CYQGF88oJngA== X-Received: by 2002:a05:6512:3a90:b0:52e:fa5f:b6a7 with SMTP id 2adb3069b0e04-53870496c1fmr5903737e87.13.1727362231305; Thu, 26 Sep 2024 07:50:31 -0700 (PDT) Received: from localhost.localdomain ([89.47.253.130]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a93c294833asm5589966b.98.2024.09.26.07.50.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2024 07:50:30 -0700 (PDT) From: James Clark To: irogers@google.com, linux-perf-users@vger.kernel.org, kan.liang@linux.intel.com, ak@linux.intel.com, namhyung@kernel.org Cc: James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Weilin Wang , Dominique Martinet , Yang Li , Yang Jihong , Colin Ian King , Athira Rajeev , Howard Chu , Ze Gao , Yunseong Kim , Sun Haiyong , Jing Zhang , Yicong Yang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 6/7] perf test: Make stat test work on DT devices Date: Thu, 26 Sep 2024 15:48:37 +0100 Message-Id: <20240926144851.245903-7-james.clark@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240926144851.245903-1-james.clark@linaro.org> References: <20240926144851.245903-1-james.clark@linaro.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" PMUs aren't listed in /sys/devices/ on DT devices, so change the search directory to /sys/bus/event_source/devices which works everywhere. Also add armv8_cortex_* as a known PMU type to search for to make the test run on more devices. Acked-by: Namhyung Kim Acked-by: Kan Liang Signed-off-by: James Clark --- tools/perf/tests/shell/stat.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/perf/tests/shell/stat.sh b/tools/perf/tests/shell/stat.sh index 3f1e67795490..525d0c44fdc6 100755 --- a/tools/perf/tests/shell/stat.sh +++ b/tools/perf/tests/shell/stat.sh @@ -117,16 +117,18 @@ test_cputype() { =20 # Find a known PMU for cputype. pmu=3D"" - for i in cpu cpu_atom armv8_pmuv3_0 + devs=3D"/sys/bus/event_source/devices" + for i in $devs/cpu $devs/cpu_atom $devs/armv8_pmuv3_0 $devs/armv8_cortex= _* do - if test -d "/sys/devices/$i" + i_base=3D$(basename "$i") + if test -d "$i" then - pmu=3D"$i" + pmu=3D"$i_base" break fi - if perf stat -e "$i/instructions/" true > /dev/null 2>&1 + if perf stat -e "$i_base/instructions/" true > /dev/null 2>&1 then - pmu=3D"$i" + pmu=3D"$i_base" break fi done --=20 2.34.1 From nobody Thu Nov 28 22:50:54 2024 Received: from mail-ej1-f41.google.com (mail-ej1-f41.google.com [209.85.218.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D10BD14D70A for ; Thu, 26 Sep 2024 14:50:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362248; cv=none; b=gOHnslVQ3DhzIKQJURMKmlQ8lpvqA2FZLrQYsvx8/YyOYyehtYnrYEX49Lm0B6WRSIMIJhVeAOUsL8EFZBKG2y637TvRmLjRaFYyffJAa/RHrPDanovu1MxF7GpmO308j3KLyCArJNLEa+BOPraSO8H0C3GxvWUQkMzTOYVUSuY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727362248; c=relaxed/simple; bh=Qr+FNYhdDxrWM0dGo1ZIRGCjHDEeDYe5FyP2FgF9ceQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=iFba6aDfA0mcdKAypWZ9h6nVrLeXDDQAp+szgAqpTAvDap4xdefGOXC1maYictUaFYOmDeZY5p92p+q/1R9H3WKzEpQ+mz1kIzdcE5dsZAry54FnS427727L0FmeQGiaz1/DuRu2IRdpXsR4pebLVtH9Y/6qwVO6pX8FHNqLIS8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=ovUvq+YB; arc=none smtp.client-ip=209.85.218.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ovUvq+YB" Received: by mail-ej1-f41.google.com with SMTP id a640c23a62f3a-a8a6d1766a7so148329566b.3 for ; Thu, 26 Sep 2024 07:50:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1727362245; x=1727967045; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ODdlKFq2yo+wpxcR2RtzNa0ArGaQotdno3xb1lEd+xc=; b=ovUvq+YBqJTdjGdUndD2ydyg4PdhaFNpNN4+Y1EuGYVlEGL9w839p+4WKd0TvPVJ5E 76zE9txM++Fnz0ZIWGKSRkG1RrK9jTXe3jxY6HewrjjEqyWlFWbX9qWnru6fwH3jLDjk hTQZHWrx6oD1BeJSmJLF7W5yk5B19Cc0iKRwCyqvibSWVkngBvkDyJAVX0dYYg3eecmy 8a2ZHyR0Fbo+/zzKzGaFqYIHECnwmD8OoNdUnFzXr7TlIoU2NgepQmuATqAiL7n7SmiG nZehImcZgK7fLCNIYK889vfOjYRdL5DyceVTq1mu/1AOzXVgw4ndWNV/u1hWouAg5/Qg rH2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727362245; x=1727967045; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ODdlKFq2yo+wpxcR2RtzNa0ArGaQotdno3xb1lEd+xc=; b=jJy5Jmk3BOwwAS4NLIvvqpjA/lBjdsBiCamnVK8gZOY0pkT4MkAMvaJSqTG977td3+ ckk8bdU+cs+rmLuIvJJWEQTwR/uMWfxcDzRKZkxRhAdaOaahy0i6hMYuwK6qiIkW9gyK PN3K7D3Ef6r+1tg3A7bI/vKdN+pQvdEzxORY3Lg+J5yMdIFysyzFl/KpQycUlzs5SnBl etLZIwGII71yjA2AOrYy31BDeicgUzz+8nDZvv/MH93u3vtvYrNfOQQWEtmr7+Uuhn1Y cqjlFtVoAFR9UgctVOqBQeqlZht7RgECY2dGs/HUP0kGDnVKJEOOBYUG4XB3T4jNko36 1gtg== X-Forwarded-Encrypted: i=1; AJvYcCXwjtujQm5jjhZ+Xr+LYGqhJ5nHA/K0NhDUPU7zoriYj8W9LLCkbNNyRL62i0hMphpbtFf+AtX5s+3JbXY=@vger.kernel.org X-Gm-Message-State: AOJu0YzlqBjGvWZIWrfAbLcrOXqToeokIP2o4Hj9T20tVrA8Cgs++5pO NsWSEFgmGYh3DDzzuvW83LYzGERY0yoE6vGabcZ4u4MFHUqLBt8rXwEvbwG1/O0= X-Google-Smtp-Source: AGHT+IGmU9ciHKtvpxRtVIFD3I+x+IdqvRKKSQEPHUiKVg12Y1sJLmKKKX1VujHonF3Ic/bxX9np9w== X-Received: by 2002:a17:906:f58e:b0:a7a:97ca:3059 with SMTP id a640c23a62f3a-a93a03f4a83mr522030066b.34.1727362245093; Thu, 26 Sep 2024 07:50:45 -0700 (PDT) Received: from localhost.localdomain ([89.47.253.130]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a93c294833asm5589966b.98.2024.09.26.07.50.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2024 07:50:44 -0700 (PDT) From: James Clark To: irogers@google.com, linux-perf-users@vger.kernel.org, kan.liang@linux.intel.com, ak@linux.intel.com, namhyung@kernel.org Cc: James Clark , John Garry , Will Deacon , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Weilin Wang , Dominique Martinet , Yang Li , Athira Rajeev , Colin Ian King , Yang Jihong , Howard Chu , Ze Gao , Yanteng Si , Sun Haiyong , Jing Zhang , Yicong Yang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 7/7] perf test: Add a test for default perf stat command Date: Thu, 26 Sep 2024 15:48:38 +0100 Message-Id: <20240926144851.245903-8-james.clark@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240926144851.245903-1-james.clark@linaro.org> References: <20240926144851.245903-1-james.clark@linaro.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Test that one cycles event is opened for each core PMU when "perf stat" is run without arguments. The event line can either be output as "pmu/cycles/" or just "cycles" if there is only one PMU. Include 2 spaces for padding in the one PMU case to avoid matching when the word cycles is included in metric descriptions. Acked-by: Namhyung Kim Acked-by: Kan Liang Signed-off-by: James Clark --- tools/perf/tests/shell/stat.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tools/perf/tests/shell/stat.sh b/tools/perf/tests/shell/stat.sh index 525d0c44fdc6..5a2ca2bcf94d 100755 --- a/tools/perf/tests/shell/stat.sh +++ b/tools/perf/tests/shell/stat.sh @@ -148,6 +148,30 @@ test_cputype() { echo "cputype test [Success]" } =20 +test_hybrid() { + # Test the default stat command on hybrid devices opens one cycles event= for + # each CPU type. + echo "hybrid test" + + # Count the number of core PMUs, assume minimum of 1 + pmus=3D$(ls /sys/bus/event_source/devices/*/cpus 2>/dev/null | wc -l) + if [ "$pmus" -lt 1 ] + then + pmus=3D1 + fi + + # Run default Perf stat + cycles_events=3D$(perf stat -- true 2>&1 | grep -E "/cycles/| cycles "= | wc -l) + + if [ "$pmus" -ne "$cycles_events" ] + then + echo "hybrid test [Found $pmus PMUs but $cycles_events cycles events. = Failed]" + err=3D1 + return + fi + echo "hybrid test [Success]" +} + test_default_stat test_stat_record_report test_stat_record_script @@ -155,4 +179,5 @@ test_stat_repeat_weak_groups test_topdown_groups test_topdown_weak_groups test_cputype +test_hybrid exit $err --=20 2.34.1