Skip to content

Commit 8bc75f6

Browse files
captain5050acmel
authored andcommitted
perf parse-events: Support wildcards on raw events
Legacy raw events like r1a open as PERF_TYPE_RAW on non-hybrid systems and on each hybrid PMU on hybrid systems. Rather than iterate hybrid PMUs add a perf_pmu__supports_wildcard_numeric function that says when a numeric event should be opened upon it. If the parsed event specifies the type of the PMU then don't wildcard match PMUs, use the specified PMU type. Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Kan Liang <kan.liang@linux.intel.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Ahmad Yasin <ahmad.yasin@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Caleb Biggers <caleb.biggers@intel.com> Cc: Edward Baker <edward.baker@intel.com> Cc: Florian Fischer <florian.fischer@muhq.space> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.g.garry@oracle.com> Cc: Kajol Jain <kjain@linux.ibm.com> Cc: Kang Minchul <tegongkang@gmail.com> Cc: Leo Yan <leo.yan@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Perry Taylor <perry.taylor@intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: Rob Herring <robh@kernel.org> Cc: Samantha Alt <samantha.alt@intel.com> Cc: Stephane Eranian <eranian@google.com> Cc: Sumanth Korikkar <sumanthk@linux.ibm.com> Cc: Suzuki Poulouse <suzuki.poulose@arm.com> Cc: Thomas Richter <tmricht@linux.ibm.com> Cc: Tiezhu Yang <yangtiezhu@loongson.cn> Cc: Weilin Wang <weilin.wang@intel.com> Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com> Cc: Yang Jihong <yangjihong1@huawei.com> Link: https://lore.kernel.org/r/20230502223851.2234828-27-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent d7f21df commit 8bc75f6

File tree

5 files changed

+52
-20
lines changed

5 files changed

+52
-20
lines changed

tools/perf/util/parse-events.c

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include "util/parse-branch-options.h"
2626
#include "util/evsel_config.h"
2727
#include "util/event.h"
28-
#include "util/parse-events-hybrid.h"
2928
#include "util/pmu-hybrid.h"
3029
#include "util/bpf-filter.h"
3130
#include "util/util.h"
@@ -1448,15 +1447,14 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
14481447
#endif
14491448
}
14501449

1451-
int parse_events_add_numeric(struct parse_events_state *parse_state,
1452-
struct list_head *list,
1453-
u32 type, u64 config,
1454-
struct list_head *head_config)
1450+
static int __parse_events_add_numeric(struct parse_events_state *parse_state,
1451+
struct list_head *list,
1452+
struct perf_pmu *pmu, u32 type, u64 config,
1453+
struct list_head *head_config)
14551454
{
14561455
struct perf_event_attr attr;
14571456
LIST_HEAD(config_terms);
14581457
const char *name, *metric_id;
1459-
bool hybrid;
14601458
int ret;
14611459

14621460
memset(&attr, 0, sizeof(attr));
@@ -1474,19 +1472,41 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
14741472

14751473
name = get_config_name(head_config);
14761474
metric_id = get_config_metric_id(head_config);
1477-
ret = parse_events__add_numeric_hybrid(parse_state, list, &attr,
1478-
name, metric_id,
1479-
&config_terms, &hybrid);
1480-
if (hybrid)
1481-
goto out_free_terms;
1482-
1483-
ret = add_event(list, &parse_state->idx, &attr, name, metric_id,
1484-
&config_terms);
1485-
out_free_terms:
1475+
ret = __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, name,
1476+
metric_id, pmu, &config_terms, /*auto_merge_stats=*/false,
1477+
/*cpu_list=*/NULL) ? 0 : -ENOMEM;
14861478
free_config_terms(&config_terms);
14871479
return ret;
14881480
}
14891481

1482+
int parse_events_add_numeric(struct parse_events_state *parse_state,
1483+
struct list_head *list,
1484+
u32 type, u64 config,
1485+
struct list_head *head_config,
1486+
bool wildcard)
1487+
{
1488+
struct perf_pmu *pmu = NULL;
1489+
bool found_supported = false;
1490+
1491+
if (!wildcard)
1492+
return __parse_events_add_numeric(parse_state, list, /*pmu=*/NULL,
1493+
type, config, head_config);
1494+
1495+
while ((pmu = perf_pmu__scan(pmu)) != NULL) {
1496+
int ret;
1497+
1498+
if (!perf_pmu__supports_wildcard_numeric(pmu))
1499+
continue;
1500+
1501+
found_supported = true;
1502+
ret = __parse_events_add_numeric(parse_state, list, pmu, pmu->type,
1503+
config, head_config);
1504+
if (ret)
1505+
return ret;
1506+
}
1507+
return found_supported ? 0 : -EINVAL;
1508+
}
1509+
14901510
int parse_events_add_tool(struct parse_events_state *parse_state,
14911511
struct list_head *list,
14921512
int tool_event)

tools/perf/util/parse-events.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
166166
int parse_events_add_numeric(struct parse_events_state *parse_state,
167167
struct list_head *list,
168168
u32 type, u64 config,
169-
struct list_head *head_config);
169+
struct list_head *head_config,
170+
bool wildcard);
170171
int parse_events_add_tool(struct parse_events_state *parse_state,
171172
struct list_head *list,
172173
int tool_event);

tools/perf/util/parse-events.y

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ value_sym '/' event_config '/'
435435

436436
list = alloc_list();
437437
ABORT_ON(!list);
438-
err = parse_events_add_numeric(_parse_state, list, type, config, $3);
438+
err = parse_events_add_numeric(_parse_state, list, type, config, $3,
439+
/*wildcard=*/false);
439440
parse_events_terms__delete($3);
440441
if (err) {
441442
free_list_evsel(list);
@@ -452,7 +453,9 @@ value_sym sep_slash_slash_dc
452453

453454
list = alloc_list();
454455
ABORT_ON(!list);
455-
ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL));
456+
ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config,
457+
/*head_config=*/NULL,
458+
/*wildcard=*/false));
456459
$$ = list;
457460
}
458461
|
@@ -596,7 +599,8 @@ PE_VALUE ':' PE_VALUE opt_event_config
596599

597600
list = alloc_list();
598601
ABORT_ON(!list);
599-
err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4);
602+
err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4,
603+
/*wildcard=*/false);
600604
parse_events_terms__delete($4);
601605
if (err) {
602606
free(list);
@@ -618,7 +622,8 @@ PE_RAW opt_event_config
618622
num = strtoull($1 + 1, NULL, 16);
619623
ABORT_ON(errno);
620624
free($1);
621-
err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, num, $2);
625+
err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, num, $2,
626+
/*wildcard=*/true);
622627
parse_events_terms__delete($2);
623628
if (err) {
624629
free(list);

tools/perf/util/pmu.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,11 @@ bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu)
16551655
return is_pmu_core(pmu->name) || perf_pmu__is_hybrid(pmu->name);
16561656
}
16571657

1658+
bool perf_pmu__supports_wildcard_numeric(const struct perf_pmu *pmu)
1659+
{
1660+
return is_pmu_core(pmu->name) || perf_pmu__is_hybrid(pmu->name);
1661+
}
1662+
16581663
static bool pmu_alias_is_duplicate(struct sevent *alias_a,
16591664
struct sevent *alias_b)
16601665
{

tools/perf/util/pmu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);
221221

222222
bool is_pmu_core(const char *name);
223223
bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu);
224+
bool perf_pmu__supports_wildcard_numeric(const struct perf_pmu *pmu);
224225
void print_pmu_events(const struct print_callbacks *print_cb, void *print_state);
225226
bool pmu_have_event(const char *pname, const char *name);
226227

0 commit comments

Comments
 (0)