There may be multiple reasons for EOPNOTSUPP. Sometimes we cannot determine which one it is.
For example, when we set up uprobe with 32-bit perf and arm64 kernel on some hardware that does not support sampling/overflow-interrupts, $ perf probe -x /lib/libc.so.6 malloc $ perf record -e probe_libc:malloc -a ls Before this patch: probe_libc:malloc: PMU Hardware doesn't support sampling/overflow-interrupts. Try 'perf stat' After this patch: probe_libc:malloc: PMU Hardware may not support sampling/overflow-interrupts. Try 'perf stat'. Some 64-bit architectures may not support 32-bit instruction probing. Signed-off-by: He Zhe <zhe...@windriver.com> --- tools/perf/util/evsel.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 1bf76864c4f2..aa56511ddf60 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2697,22 +2697,24 @@ int evsel__open_strerror(struct evsel *evsel, struct target *target, break; case EOPNOTSUPP: if (evsel->core.attr.aux_output) - return scnprintf(msg, size, - "%s: PMU Hardware doesn't support 'aux_output' feature", + printed += scnprintf(msg + printed, size, + "%s: PMU Hardware may not support 'aux_output' feature.\n", evsel__name(evsel)); if (evsel->core.attr.sample_period != 0) - return scnprintf(msg, size, - "%s: PMU Hardware doesn't support sampling/overflow-interrupts. Try 'perf stat'", + printed += scnprintf(msg + printed, size, + "%s: PMU Hardware doesn't support sampling/overflow-interrupts. Try 'perf stat'.\n", evsel__name(evsel)); if (evsel->core.attr.precise_ip) - return scnprintf(msg, size, "%s", - "\'precise\' request may not be supported. Try removing 'p' modifier."); + printed += scnprintf(msg + printed, size, "%s", + "\'precise\' request may not be supported. Try removing 'p' modifier.\n"); #if defined(__i386__) || defined(__x86_64__) if (evsel->core.attr.type == PERF_TYPE_HARDWARE) - return scnprintf(msg, size, "%s", + printed += scnprintf(msg + printed, size, "%s", "No hardware sampling interrupt available.\n"); #endif - break; + scnprintf(msg + printed, size, "%s", + "Some 64-bit architectures may not support 32-bit instruction uprobe.\n"); + return; case EBUSY: if (find_process("oprofiled")) return scnprintf(msg, size, -- 2.17.1