Re: [PATCH v3 11/13] perf tools: improve IBS error handling

Kim Phillips
2021-12-01T15:30:26Z

Hi Stephane,

This v3 looks like it's the same as in the v1 of the series,
which got nacked by acme.

Please use the newer patches provided. Instructions to do
so haven't changed since then.

Thanks,

Kim

On 11/30/21 7:02 PM, Stephane Eranian wrote:
> From: Kim Phillips <kim.phillips@amd.com>
>
> This patch improves the error message returned on failed perf_event_open() on
> AMD when using IBS.
>
> Signed-off-by: Kim Phillips <kim.phillips@amd.com>
> ---
> tools/perf/util/evsel.c | 42 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 42 insertions(+)
>
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index ac0127be0459..39e9063c0a80 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -2852,12 +2852,52 @@ static bool find_process(const char *name)
> return ret ? false : true;
> }
>
> +static bool is_amd;
> +
> +static char *fgrep(FILE *inf, const char *str)
> +{
> + char line[256];
> + int slen = strlen(str);
> +
> + while (!feof(inf)) {
> + if (!fgets(line, 256, inf))
> + break;
> + if (strncmp(line, str, slen))
> + continue;
> +
> + return strdup(line);
> + }
> +
> + return NULL;
> +}
> +
> +static void detect_amd(void)
> +{
> + FILE *inf = fopen("/proc/cpuinfo", "r");
> + char *res;
> +
> + if (!inf)
> + return;
> +
> + res = fgrep(inf, "vendor_id");
> +
> + if (res) {
> + char *s = strchr(res, ':');
> +
> + is_amd = s && !strcmp(s, ": AuthenticAMD\n");
> + free(res);
> + }
> + fclose(inf);
> +}
> +
> int evsel__open_strerror(struct evsel *evsel, struct target *target,
> int err, char *msg, size_t size)
> {
> char sbuf[STRERR_BUFSIZE];
> int printed = 0, enforced = 0;
>
> + detect_amd();
> +
> switch (err) {
> case EPERM:
> case EACCES:
> @@ -2950,6 +2990,8 @@ int evsel__open_strerror(struct evsel *evsel, struct target *target,
> return scnprintf(msg, size, "wrong clockid (%d).", clockid);
> if (perf_missing_features.aux_output)
> return scnprintf(msg, size, "The 'aux_output' feature is not supported, update the kernel.");
> + if (is_amd && (evsel->core.attr.precise_ip || !strncmp(evsel->pmu_name, "ibs", 3)) && (evsel->core.attr.exclude_kernel))
> + return scnprintf(msg, size, "AMD IBS can't exclude kernel events. Try running at a higher privilege level.");
> break;
> case ENODATA:
> return scnprintf(msg, size, "Cannot collect data source with the load latency event alone. "
>