From nobody Sun Dec 14 19:12:27 2025 Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) (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 AF0981527BE for ; Fri, 10 May 2024 05:38:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715319489; cv=none; b=BcQeKQLedQyBl8TFn+KMT8Ljx4XJrCFjA6x1bAqJ31pzrPrsKO3HqtC85cW7jc/Ah0lsIN79I9WSOr/xOs/CpPyFDxsimh+YTl6NVRaVynrweoJWWQXQL59ZW8lPtDQrNbASulE9lt19i/2emEPZfMoiNix7Po+Tyep6bGwgatk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715319489; c=relaxed/simple; bh=iQp86WhJwgC1NI9vANYNuDRZL+PBh+5rBgpbw6bQX+I=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=SIu3yxz7Rs+7NfMsmjudAUfubYEYu0JJIOteuG3L1cGKOaTF+5JBrxmpH45wdFa+n5tx1rzZ26xuJ8ovpYjUtdvjgz4/kHfymchCX3bH9KkEKDccaAuUbmrvl2tjGJAWD4KDSkqljexJjGIIf0wswasLL7yw1FXPVXjW8J/WvOg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=pTs1V4RE; arc=none smtp.client-ip=209.85.128.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="pTs1V4RE" Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-61be26af113so27900157b3.1 for ; Thu, 09 May 2024 22:38:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1715319486; x=1715924286; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=SA0P+oT0/VAImEkmD4noOd22el5UFzWPyOCiJ0gQY+o=; b=pTs1V4REuN3s3Jb8Gsf8UmW7QxEsemZQIizY8USyy1sQCLg3Cs6u2CgINUel9iHHf1 s+YQUFkYvTvUqIan02PRgUOIPIJbCPfQSvuXYYM077ZnZbbfqvJsahirqbDEgWfyGKwi 0s07Ab1m44P+lJMhOlchKGbRwwXUwtm92dVU3Ka3KI+ZFkYhsRIFBluG36r4ZT64pUnE lZvhEBGcalla/fFgLGBrC3QN1g5Ajq64pNSXGstwX7gUxP+tCjzOQJ11pD3EFXdOaRoe aKn5sKL9zDzI0EvC1ervv73XA4SWyzuAbIV/szWXP66U5WmP5tVwjV3A0aDmoKJZWexU hhtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715319486; x=1715924286; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=SA0P+oT0/VAImEkmD4noOd22el5UFzWPyOCiJ0gQY+o=; b=X7AO0aTp2W6ocRPaQFmDXrM6+GKonyO4pgPWX9YSWEJFXVGRiqdS7rmdEyUCx8Q4ur 7XeOst0+AUWJ3tVifJgBPUUKxn+zUm37ZCLgtj6I0qqUOVie5Za24bsEn0SocQtksEyI l4sjiyqALgC/IrfBCActj8hlwYa2sw/JCTc7Lva29zOaP9o7cJXVRaTNmjG1l1ojZ8d/ JClAQFA3lqaoJsFpIyIxt5XLR+aBrX9bf7WRAcOJYaE8ytl+1ZqN6Q/1ZVlfg2VyQwhg 3SQUg+3/3odygJ2xf/+uiwkdhMBBTCXeH3E3J5xDFfLo+DWqgeyOYKd6XMWlpilhBv8f 2leg== X-Forwarded-Encrypted: i=1; AJvYcCVW9OIwudVl0fwNJ6f+x5x69TgYJ7NrxNFHFNUAFqSWnqg5otTkwBNP2OF5W6nFiEh2Dx+Ee2lrH1MLBiOAzmzGkxCvnyfaq2ojKBZM X-Gm-Message-State: AOJu0YwX4vi+eU1UMZI95Pm+qCci8AR4YVlRi23lB2wiezshwbUOqZ3c IS2qgvz3jzwIfRGxHfH8HEQ17/fTpX5GJ4lP8f+ytNJCSAKXIPUzn+2yXskQsYOQU1GsVR44kyj V+LSbBg== X-Google-Smtp-Source: AGHT+IFx9uSqqUpY1vOJkuteO3S7PtFgtmXqFQAlFsZba51Zp/FAznyfk763w6RecjMzVymrpIlaSZuUA4Lg X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:79ed:c375:51e3:ed39]) (user=irogers job=sendgmr) by 2002:a05:6902:150a:b0:dc2:2ace:860 with SMTP id 3f1490d57ef6-dee4f3117c3mr139280276.2.1715319486529; Thu, 09 May 2024 22:38:06 -0700 (PDT) Date: Thu, 9 May 2024 22:37:01 -0700 In-Reply-To: <20240510053705.2462258-1-irogers@google.com> Message-Id: <20240510053705.2462258-2-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240510053705.2462258-1-irogers@google.com> X-Mailer: git-send-email 2.45.0.118.g7fe29c98d7-goog Subject: [PATCH v3 1/5] perf evsel: Add alternate_hw_config and use in evsel__match From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Ravi Bangoria , James Clark , Yang Jihong , Ze Gao , Leo Yan , Song Liu , K Prateek Nayak , Kaige Ye , Yicong Yang , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Ian Rogers --- tools/perf/builtin-diff.c | 6 ++-- tools/perf/util/evsel.c | 21 ++++++++++++++ tools/perf/util/evsel.h | 19 ++----------- tools/perf/util/parse-events.c | 51 +++++++++++++++++++++------------- tools/perf/util/parse-events.h | 6 ++++ tools/perf/util/pmu.c | 6 +++- tools/perf/util/pmu.h | 2 +- 7 files changed, 70 insertions(+), 41 deletions(-) diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 57d300d8e570..500a8f9e7c0d 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -483,13 +483,13 @@ static struct perf_diff pdiff =3D { }, }; =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 3536404e9447..dfdb60c7a364 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -295,6 +295,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) @@ -441,6 +442,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: @@ -1600,6 +1603,24 @@ static int evsel__read_group(struct evsel *leader, i= nt cpu_map_idx, int thread) return evsel__process_group_data(leader, cpu_map_idx, thread, data); } =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) { u64 read_format =3D evsel->core.attr.read_format; diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 517cff431de2..46e3589314f1 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -101,6 +101,7 @@ struct evsel { int bpf_fd; struct bpf_object *bpf_obj; struct list_head config_terms; + u64 alternate_hw_config; }; =20 /* @@ -354,26 +355,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 2b9ede311c31..c72e1722b1fb 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -230,7 +230,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, - const char *cpu_list) + const char *cpu_list, u64 alternate_hw_config) { struct evsel *evsel; struct perf_cpu_map *cpus =3D pmu ? perf_cpu_map__get(pmu->cpus) : @@ -266,6 +266,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); @@ -288,16 +289,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, @@ -312,7 +316,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=3D*/"0"); + /*cpu_list=3D*/"0", + /*alternate_hw_config=3D*/PERF_COUNT_HW_MAX); if (!evsel) return -ENOMEM; evsel->tool_event =3D tool_event; @@ -446,7 +451,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, @@ -472,7 +477,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; @@ -503,7 +509,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); @@ -743,7 +750,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, @@ -1043,6 +1050,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; @@ -1354,8 +1362,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; } @@ -1413,7 +1422,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; @@ -1450,7 +1459,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 @@ -1471,7 +1480,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 (!parse_state->fake_pmu && 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; } @@ -1517,7 +1527,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; @@ -1596,7 +1607,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); @@ -1611,7 +1622,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, parse_state->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); @@ -1664,7 +1675,8 @@ int parse_events_multi_pmu_add_or_add_pmu(struct pars= e_events_state *parse_state /* Attempt to add to list assuming event_or_pmu is a PMU name. */ pmu =3D parse_state->fake_pmu ?: 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 pmu =3D NULL; @@ -1676,7 +1688,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; } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index e7ac1f13376d..8dd426b8aeb9 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 { diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index b3b072feef02..8f02fc5365aa 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1547,7 +1547,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; @@ -1575,6 +1575,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) @@ -1583,6 +1584,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 561716aa2b25..a4df58ce70ce 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -211,7 +211,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.45.0.118.g7fe29c98d7-goog