From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
Adrian Hunter <adrian.hunter@intel.com>,
Kan Liang <kan.liang@linux.intel.com>,
Zhengjun Xing <zhengjun.xing@linux.intel.com>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v1] perf parse-events: Avoid segv if PMU lookup fails for legacy cache terms
Date: Wed, 12 Jul 2023 16:27:07 -0300 [thread overview]
Message-ID: <ZK7+i63XprkGwjCE@kernel.org> (raw)
In-Reply-To: <20230712065250.1450306-1-irogers@google.com>
Em Tue, Jul 11, 2023 at 11:52:50PM -0700, Ian Rogers escreveu:
> libfuzzer found the following command could segv:
> ```
> $ perf stat -e cpu/L2,L2/ true
> ```
> This is because the L2 term rewrites the perf_event_attr type to
> PERF_TYPE_HW_CACHE which then fails the PMU lookup for the second
> legacy cache term.
>
> The new failure is consistent with repeated hardware terms:
> ```
> $ perf stat -e cpu/L2,L2/ true
> event syntax error: 'cpu/L2,L2/'
> \___ Failed to find PMU for type 3
>
> Initial error:
> event syntax error: 'cpu/L2,L2/'
> \___ Failed to find PMU for type 3
> Run 'perf list' for a list of valid events
>
> Usage: perf stat [<options>] [<command>]
>
> -e, --event <event> event selector. use 'perf list' to list available events
> $ perf stat -e cpu/cycles,cycles/ true
> event syntax error: 'cpu/cycles,cycles/'
> \___ Failed to find PMU for type 0
>
> Initial error:
> event syntax error: 'cpu/cycles,cycles/'
> \___ Failed to find PMU for type 0
> Run 'perf list' for a list of valid events
>
> Usage: perf stat [<options>] [<command>]
>
> -e, --event <event> event selector. use 'perf list' to list available events
> ```
I added the Fixes as requested:
Fixes: 6fd1e5191591f9d5 ("perf parse-events: Support PMUs for legacy cache events")
Please check if the patch below helps a bit giving more info to the
user, but still a bit cryptic:
⬢[acme@toolbox perf-tools]$ perf stat -e cpu/L2,L2/ true
event syntax error: 'cpu/L2,L2/'
\___ Failed to find PMU for perf_event_attr.type 3 (PERF_TYPE_HW_CACHE)
Initial error:
event syntax error: 'cpu/L2,L2/'
\___ Failed to find PMU for perf_event_attr.type 3 (PERF_TYPE_HW_CACHE)
Run 'perf list' for a list of valid events
Usage: perf stat [<options>] [<command>]
-e, --event <event> event selector. use 'perf list' to list available events
⬢[acme@toolbox perf-tools]$
And the other case is needs more patching, so better leave this for 6.6.
⬢[acme@toolbox perf-tools]$ perf stat -e cpu/cycles,cycles/ true
event syntax error: 'cpu/cycles,cycles/'
\___ Failed to find PMU for type 0
Initial error:
event syntax error: 'cpu/cycles,cycles/'
\___ Failed to find PMU for type 0
Run 'perf list' for a list of valid events
Usage: perf stat [<options>] [<command>]
-e, --event <event> event selector. use 'perf list' to list available events
⬢[acme@toolbox perf-tools]$
- Arnaldo
diff --git a/tools/perf/util/evsel_fprintf.h b/tools/perf/util/evsel_fprintf.h
index c8a9fac2f2ddc0f2..044612774a962020 100644
--- a/tools/perf/util/evsel_fprintf.h
+++ b/tools/perf/util/evsel_fprintf.h
@@ -4,6 +4,7 @@
#include <stdio.h>
#include <stdbool.h>
+#include <linux/types.h>
struct evsel;
@@ -45,6 +46,8 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al,
typedef int (*attr__fprintf_f)(FILE *, const char *, const char *, void *);
+const char *stringify_perf_type_id(u64 value);
+
int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
attr__fprintf_f attr__fprintf, void *priv);
#endif // __PERF_EVSEL_H
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index acde097e327cce8c..8678469cf974070a 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -25,6 +25,7 @@
#include "asm/bug.h"
#include "util/parse-branch-options.h"
#include "util/evsel_config.h"
+#include "util/evsel_fprintf.h"
#include "util/event.h"
#include "util/bpf-filter.h"
#include "util/util.h"
@@ -1219,9 +1220,11 @@ static int config_term_pmu(struct perf_event_attr *attr,
if (!pmu) {
char *err_str;
- if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0)
+ if (asprintf(&err_str, "Failed to find PMU for perf_event_attr.type %d (%s)", attr->type,
+ stringify_perf_type_id(attr->type)) >= 0) {
parse_events_error__handle(err, term->err_term,
err_str, /*help=*/NULL);
+ }
return -EINVAL;
}
if (perf_pmu__supports_legacy_cache(pmu)) {
diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
index 2247991451f3aa1b..ce97371eda027271 100644
--- a/tools/perf/util/perf_event_attr_fprintf.c
+++ b/tools/perf/util/perf_event_attr_fprintf.c
@@ -74,7 +74,7 @@ static void __p_read_format(char *buf, size_t size, u64 value)
}
#define ENUM_ID_TO_STR_CASE(x) case x: return (#x);
-static const char *stringify_perf_type_id(u64 value)
+const char *stringify_perf_type_id(u64 value)
{
switch (value) {
ENUM_ID_TO_STR_CASE(PERF_TYPE_HARDWARE)
next prev parent reply other threads:[~2023-07-12 19:27 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-12 6:52 [PATCH v1] perf parse-events: Avoid segv if PMU lookup fails for legacy cache terms Ian Rogers
2023-07-12 19:27 ` Arnaldo Carvalho de Melo [this message]
2023-07-12 20:29 ` Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZK7+i63XprkGwjCE@kernel.org \
--to=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=zhengjun.xing@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.