[RFC 1/3] perf tool: Introduce arch-specific supplemental perf open strerror capability
Kim Phillips
kim.phillips at arm.com
Tue Oct 24 01:04:04 PDT 2017
Introduce new tools/perf/arch/*/util/evsel.c:perf_evsel__suppl_strerror()
so each arch can start to customize usability for its h/w PMU drivers.
Signed-off-by: Kim Phillips <kim.phillips at arm.com>
---
tools/perf/arch/x86/util/Build | 1 +
tools/perf/arch/x86/util/evsel.c | 24 ++++++++++++++++++++++++
tools/perf/util/evsel.c | 21 +++++++++++++++------
tools/perf/util/evsel.h | 2 ++
4 files changed, 42 insertions(+), 6 deletions(-)
create mode 100644 tools/perf/arch/x86/util/evsel.c
diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
index f95e6f46ef0d..90ae9358ec21 100644
--- a/tools/perf/arch/x86/util/Build
+++ b/tools/perf/arch/x86/util/Build
@@ -4,6 +4,7 @@ libperf-y += pmu.o
libperf-y += kvm-stat.o
libperf-y += perf_regs.o
libperf-y += group.o
+libperf-y += evsel.o
libperf-$(CONFIG_DWARF) += dwarf-regs.o
libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
diff --git a/tools/perf/arch/x86/util/evsel.c b/tools/perf/arch/x86/util/evsel.c
new file mode 100644
index 000000000000..95c623c0119f
--- /dev/null
+++ b/tools/perf/arch/x86/util/evsel.c
@@ -0,0 +1,24 @@
+#include <string.h>
+
+#include <linux/perf_event.h>
+#include <linux/err.h>
+
+#include "../../util/evsel.h"
+
+int perf_evsel__suppl_strerror(struct perf_evsel *evsel,
+ struct target *target __maybe_unused,
+ int err, char *msg, size_t size)
+{
+ switch (err) {
+ case EOPNOTSUPP:
+ if (evsel->attr.type == PERF_TYPE_HARDWARE)
+ return scnprintf(msg, size, "%s",
+ "No hardware sampling interrupt available.\n"
+ "No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it.");
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 3ec0aed0bdcb..a6aa18e3a0c2 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2686,12 +2686,27 @@ static bool find_process(const char *name)
return ret ? false : true;
}
+int __weak perf_evsel__suppl_strerror(struct perf_evsel *evsel __maybe_unused,
+ struct target *target __maybe_unused,
+ int err __maybe_unused,
+ char *msg __maybe_unused,
+ size_t size __maybe_unused)
+{
+ return 0;
+}
+
int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
int err, char *msg, size_t size)
{
char sbuf[STRERR_BUFSIZE];
int printed = 0;
+ printed = perf_evsel__suppl_strerror(evsel, target, err, msg, size);
+ if (printed > 0) {
+ msg += printed;
+ size -= printed;
+ }
+
switch (err) {
case EPERM:
case EACCES:
@@ -2745,12 +2760,6 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
if (evsel->attr.precise_ip)
return scnprintf(msg, size, "%s",
"\'precise\' request may not be supported. Try removing 'p' modifier.");
-#if defined(__i386__) || defined(__x86_64__)
- if (evsel->attr.type == PERF_TYPE_HARDWARE)
- return scnprintf(msg, size, "%s",
- "No hardware sampling interrupt available.\n"
- "No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it.");
-#endif
break;
case EBUSY:
if (find_process("oprofiled"))
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 77bd310eb0cb..aef759c178aa 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -416,6 +416,8 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
char *msg, size_t msgsize);
int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
int err, char *msg, size_t size);
+int perf_evsel__suppl_strerror(struct perf_evsel *evsel, struct target *target,
+ int err, char *msg, size_t size);
static inline int perf_evsel__group_idx(struct perf_evsel *evsel)
{
--
2.14.2
More information about the linux-arm-kernel
mailing list