summaryrefslogtreecommitdiffstats
path: root/tools/lib
diff options
context:
space:
mode:
authorRavi Bangoria <ravi.bangoria@linux.vnet.ibm.com>2017-02-03 05:26:42 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-02-08 07:28:54 -0500
commit27cf5706a04e53f6844c71be1cbbf1df665f5d19 (patch)
tree8575e310a964675f8ad81af3f91def5e54629495 /tools/lib
parentf23610245c1aa0e912476e642bd5107d04122230 (diff)
perf sdt: Show proper hint when event not yet in place via 'perf probe'
All events from 'perf list', except SDT events, can be directly recorded with 'perf record'. But, the flow is little different for SDT events. Probe points for SDT event needs to be created using 'perf probe' before recording it using 'perf record'. Perf shows misleading hint when a user tries to record SDT event without first creating a probe point. Show proper hint there. Before patch: $ perf record -a -e sdt_glib:idle__add event syntax error: 'sdt_glib:idle__add' \___ unknown tracepoint Error: File /sys/kernel/debug/tracing/events/sdt_glib/idle__add not found. Hint: Perhaps this kernel misses some CONFIG_ setting to enable this feature?. ... After patch: $ perf record -a -e sdt_glib:idle__add event syntax error: 'sdt_glib:idle__add' \___ unknown tracepoint Error: File /sys/kernel/debug/tracing/events/sdt_glib/idle__add not found. Hint: SDT event cannot be directly recorded on. Please first use 'perf probe sdt_glib:idle__add' before recording it. ... $ perf probe sdt_glib:idle__add Added new event: sdt_glib:idle__add (on %idle__add in /usr/lib64/libglib-2.0.so.0.5000.2) You can now use it in all perf tools, such as: perf record -e sdt_glib:idle__add -aR sleep 1 $ perf record -a -e sdt_glib:idle__add [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.175 MB perf.data ] Suggested-and-Acked-by: Ingo Molnar <mingo@redhat.com> Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Acked-by: Masami Hiramatsu <mhiramat@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexis Berlemont <alexis.berlemont@gmail.com> Cc: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20170203102642.17258-1-ravi.bangoria@linux.vnet.ibm.com [ s/Please use/Please first use/ and break the Hint line in two ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/api/fs/tracing_path.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/tools/lib/api/fs/tracing_path.c b/tools/lib/api/fs/tracing_path.c
index 251b7c342a87..3e606b9c443e 100644
--- a/tools/lib/api/fs/tracing_path.c
+++ b/tools/lib/api/fs/tracing_path.c
@@ -86,9 +86,13 @@ void put_tracing_file(char *file)
86 free(file); 86 free(file);
87} 87}
88 88
89static int strerror_open(int err, char *buf, size_t size, const char *filename) 89int tracing_path__strerror_open_tp(int err, char *buf, size_t size,
90 const char *sys, const char *name)
90{ 91{
91 char sbuf[128]; 92 char sbuf[128];
93 char filename[PATH_MAX];
94
95 snprintf(filename, PATH_MAX, "%s/%s", sys, name ?: "*");
92 96
93 switch (err) { 97 switch (err) {
94 case ENOENT: 98 case ENOENT:
@@ -99,10 +103,19 @@ static int strerror_open(int err, char *buf, size_t size, const char *filename)
99 * - jirka 103 * - jirka
100 */ 104 */
101 if (debugfs__configured() || tracefs__configured()) { 105 if (debugfs__configured() || tracefs__configured()) {
102 snprintf(buf, size, 106 /* sdt markers */
103 "Error:\tFile %s/%s not found.\n" 107 if (!strncmp(filename, "sdt_", 4)) {
104 "Hint:\tPerhaps this kernel misses some CONFIG_ setting to enable this feature?.\n", 108 snprintf(buf, size,
105 tracing_events_path, filename); 109 "Error:\tFile %s/%s not found.\n"
110 "Hint:\tSDT event cannot be directly recorded on.\n"
111 "\tPlease first use 'perf probe %s:%s' before recording it.\n",
112 tracing_events_path, filename, sys, name);
113 } else {
114 snprintf(buf, size,
115 "Error:\tFile %s/%s not found.\n"
116 "Hint:\tPerhaps this kernel misses some CONFIG_ setting to enable this feature?.\n",
117 tracing_events_path, filename);
118 }
106 break; 119 break;
107 } 120 }
108 snprintf(buf, size, "%s", 121 snprintf(buf, size, "%s",
@@ -125,12 +138,3 @@ static int strerror_open(int err, char *buf, size_t size, const char *filename)
125 138
126 return 0; 139 return 0;
127} 140}
128
129int tracing_path__strerror_open_tp(int err, char *buf, size_t size, const char *sys, const char *name)
130{
131 char path[PATH_MAX];
132
133 snprintf(path, PATH_MAX, "%s/%s", sys, name ?: "*");
134
135 return strerror_open(err, buf, size, path);
136}