Commit d1f1cecc authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf list: Check if libpfm4 event is supported

Some of its event info cannot be used directly due to missing default
attributes.  Let's check if the event is supported before printing like
we do for hw and cache events.
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Acked-by: default avatarIan Rogers <irogers&gt;@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20230608232400.3056312-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f0617f52
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include "util/pmus.h" #include "util/pmus.h"
#include "util/pfm.h" #include "util/pfm.h"
#include "util/strbuf.h" #include "util/strbuf.h"
#include "util/cpumap.h"
#include "util/thread_map.h"
#include <string.h> #include <string.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -123,6 +125,36 @@ int parse_libpfm_events_option(const struct option *opt, const char *str, ...@@ -123,6 +125,36 @@ int parse_libpfm_events_option(const struct option *opt, const char *str,
return -1; return -1;
} }
static bool is_libpfm_event_supported(const char *name, struct perf_cpu_map *cpus,
struct perf_thread_map *threads)
{
struct perf_pmu *pmu;
struct evsel *evsel;
struct perf_event_attr attr = {};
bool result = true;
int ret;
ret = pfm_get_perf_event_encoding(name, PFM_PLM0|PFM_PLM3,
&attr, NULL, NULL);
if (ret != PFM_SUCCESS)
return false;
pmu = perf_pmus__find_by_type((unsigned int)attr.type);
evsel = parse_events__add_event(0, &attr, name, /*metric_id=*/NULL, pmu);
if (evsel == NULL)
return false;
evsel->is_libpfm_event = true;
if (evsel__open(evsel, cpus, threads) < 0)
result = false;
evsel__close(evsel);
evsel__delete(evsel);
return result;
}
static const char *srcs[PFM_ATTR_CTRL_MAX] = { static const char *srcs[PFM_ATTR_CTRL_MAX] = {
[PFM_ATTR_CTRL_UNKNOWN] = "???", [PFM_ATTR_CTRL_UNKNOWN] = "???",
[PFM_ATTR_CTRL_PMU] = "PMU", [PFM_ATTR_CTRL_PMU] = "PMU",
...@@ -146,6 +178,8 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state, ...@@ -146,6 +178,8 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state,
{ {
int j, ret; int j, ret;
char topic[80], name[80]; char topic[80], name[80];
struct perf_cpu_map *cpus = perf_cpu_map__empty_new(1);
struct perf_thread_map *threads = thread_map__new_by_tid(0);
strbuf_setlen(buf, 0); strbuf_setlen(buf, 0);
snprintf(topic, sizeof(topic), "pfm %s", pinfo->name); snprintf(topic, sizeof(topic), "pfm %s", pinfo->name);
...@@ -185,14 +219,15 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state, ...@@ -185,14 +219,15 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state,
ainfo.name, ainfo.desc); ainfo.name, ainfo.desc);
} }
} }
print_cb->print_event(print_state,
pinfo->name, if (is_libpfm_event_supported(name, cpus, threads)) {
topic, print_cb->print_event(print_state, pinfo->name, topic,
name, info->equiv, name, info->equiv,
/*scale_unit=*/NULL, /*scale_unit=*/NULL,
/*deprecated=*/NULL, "PFM event", /*deprecated=*/NULL, "PFM event",
info->desc, /*long_desc=*/NULL, info->desc, /*long_desc=*/NULL,
/*encoding_desc=*/buf->buf); /*encoding_desc=*/buf->buf);
}
pfm_for_each_event_attr(j, info) { pfm_for_each_event_attr(j, info) {
pfm_event_attr_info_t ainfo; pfm_event_attr_info_t ainfo;
...@@ -215,6 +250,10 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state, ...@@ -215,6 +250,10 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state,
print_attr_flags(buf, &ainfo); print_attr_flags(buf, &ainfo);
snprintf(name, sizeof(name), "%s::%s:%s", snprintf(name, sizeof(name), "%s::%s:%s",
pinfo->name, info->name, ainfo.name); pinfo->name, info->name, ainfo.name);
if (!is_libpfm_event_supported(name, cpus, threads))
continue;
print_cb->print_event(print_state, print_cb->print_event(print_state,
pinfo->name, pinfo->name,
topic, topic,
...@@ -225,6 +264,9 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state, ...@@ -225,6 +264,9 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state,
/*encoding_desc=*/buf->buf); /*encoding_desc=*/buf->buf);
} }
} }
perf_cpu_map__put(cpus);
perf_thread_map__put(threads);
} }
void print_libpfm_events(const struct print_callbacks *print_cb, void *print_state) void print_libpfm_events(const struct print_callbacks *print_cb, void *print_state)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment