diff options
-rw-r--r-- | tools/perf/builtin-record.c | 2 | ||||
-rw-r--r-- | tools/perf/builtin-stat.c | 38 | ||||
-rw-r--r-- | tools/perf/builtin-top.c | 6 |
3 files changed, 29 insertions, 17 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 93bd2ff001fb..d9dd47885218 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -326,7 +326,7 @@ try_again: | |||
326 | goto try_again; | 326 | goto try_again; |
327 | } | 327 | } |
328 | printf("\n"); | 328 | printf("\n"); |
329 | error("perfcounter syscall returned with %d (%s)\n", | 329 | error("sys_perf_event_open() syscall returned with %d (%s). /bin/dmesg may provide additional information.\n", |
330 | fd[nr_cpu][counter][thread_index], strerror(err)); | 330 | fd[nr_cpu][counter][thread_index], strerror(err)); |
331 | 331 | ||
332 | #if defined(__i386__) || defined(__x86_64__) | 332 | #if defined(__i386__) || defined(__x86_64__) |
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index b3e568ffad27..970a7f2a083d 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -153,9 +153,9 @@ struct stats walltime_nsecs_stats; | |||
153 | attrs[counter].config == PERF_COUNT_##c) | 153 | attrs[counter].config == PERF_COUNT_##c) |
154 | 154 | ||
155 | #define ERR_PERF_OPEN \ | 155 | #define ERR_PERF_OPEN \ |
156 | "Error: counter %d, sys_perf_event_open() syscall returned with %d (%s)\n" | 156 | "counter %d, sys_perf_event_open() syscall returned with %d (%s). /bin/dmesg may provide additional information." |
157 | 157 | ||
158 | static int create_perf_stat_counter(int counter) | 158 | static int create_perf_stat_counter(int counter, bool *perm_err) |
159 | { | 159 | { |
160 | struct perf_event_attr *attr = attrs + counter; | 160 | struct perf_event_attr *attr = attrs + counter; |
161 | int thread; | 161 | int thread; |
@@ -171,11 +171,14 @@ static int create_perf_stat_counter(int counter) | |||
171 | for (cpu = 0; cpu < nr_cpus; cpu++) { | 171 | for (cpu = 0; cpu < nr_cpus; cpu++) { |
172 | fd[cpu][counter][0] = sys_perf_event_open(attr, | 172 | fd[cpu][counter][0] = sys_perf_event_open(attr, |
173 | -1, cpumap[cpu], -1, 0); | 173 | -1, cpumap[cpu], -1, 0); |
174 | if (fd[cpu][counter][0] < 0) | 174 | if (fd[cpu][counter][0] < 0) { |
175 | pr_debug(ERR_PERF_OPEN, counter, | 175 | if (errno == EPERM || errno == EACCES) |
176 | *perm_err = true; | ||
177 | error(ERR_PERF_OPEN, counter, | ||
176 | fd[cpu][counter][0], strerror(errno)); | 178 | fd[cpu][counter][0], strerror(errno)); |
177 | else | 179 | } else { |
178 | ++ncreated; | 180 | ++ncreated; |
181 | } | ||
179 | } | 182 | } |
180 | } else { | 183 | } else { |
181 | attr->inherit = !no_inherit; | 184 | attr->inherit = !no_inherit; |
@@ -186,12 +189,15 @@ static int create_perf_stat_counter(int counter) | |||
186 | for (thread = 0; thread < thread_num; thread++) { | 189 | for (thread = 0; thread < thread_num; thread++) { |
187 | fd[0][counter][thread] = sys_perf_event_open(attr, | 190 | fd[0][counter][thread] = sys_perf_event_open(attr, |
188 | all_tids[thread], -1, -1, 0); | 191 | all_tids[thread], -1, -1, 0); |
189 | if (fd[0][counter][thread] < 0) | 192 | if (fd[0][counter][thread] < 0) { |
190 | pr_debug(ERR_PERF_OPEN, counter, | 193 | if (errno == EPERM || errno == EACCES) |
194 | *perm_err = true; | ||
195 | error(ERR_PERF_OPEN, counter, | ||
191 | fd[0][counter][thread], | 196 | fd[0][counter][thread], |
192 | strerror(errno)); | 197 | strerror(errno)); |
193 | else | 198 | } else { |
194 | ++ncreated; | 199 | ++ncreated; |
200 | } | ||
195 | } | 201 | } |
196 | } | 202 | } |
197 | 203 | ||
@@ -332,6 +338,7 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
332 | int status = 0; | 338 | int status = 0; |
333 | int counter, ncreated = 0; | 339 | int counter, ncreated = 0; |
334 | int child_ready_pipe[2], go_pipe[2]; | 340 | int child_ready_pipe[2], go_pipe[2]; |
341 | bool perm_err = false; | ||
335 | const bool forks = (argc > 0); | 342 | const bool forks = (argc > 0); |
336 | char buf; | 343 | char buf; |
337 | 344 | ||
@@ -390,12 +397,15 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
390 | } | 397 | } |
391 | 398 | ||
392 | for (counter = 0; counter < nr_counters; counter++) | 399 | for (counter = 0; counter < nr_counters; counter++) |
393 | ncreated += create_perf_stat_counter(counter); | 400 | ncreated += create_perf_stat_counter(counter, &perm_err); |
394 | 401 | ||
395 | if (ncreated == 0) { | 402 | if (ncreated < nr_counters) { |
396 | pr_err("No permission to collect %sstats.\n" | 403 | if (perm_err) |
397 | "Consider tweaking /proc/sys/kernel/perf_event_paranoid.\n", | 404 | error("You may not have permission to collect %sstats.\n" |
398 | system_wide ? "system-wide " : ""); | 405 | "\t Consider tweaking" |
406 | " /proc/sys/kernel/perf_event_paranoid or running as root.", | ||
407 | system_wide ? "system-wide " : ""); | ||
408 | die("Not all events could be opened.\n"); | ||
399 | if (child_pid != -1) | 409 | if (child_pid != -1) |
400 | kill(child_pid, SIGTERM); | 410 | kill(child_pid, SIGTERM); |
401 | return -1; | 411 | return -1; |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index dd625808c2a5..3d2b47d5121a 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -1214,7 +1214,9 @@ try_again: | |||
1214 | int err = errno; | 1214 | int err = errno; |
1215 | 1215 | ||
1216 | if (err == EPERM || err == EACCES) | 1216 | if (err == EPERM || err == EACCES) |
1217 | die("No permission - are you root?\n"); | 1217 | die("Permission error - are you root?\n" |
1218 | "\t Consider tweaking" | ||
1219 | " /proc/sys/kernel/perf_event_paranoid.\n"); | ||
1218 | /* | 1220 | /* |
1219 | * If it's cycles then fall back to hrtimer | 1221 | * If it's cycles then fall back to hrtimer |
1220 | * based cpu-clock-tick sw counter, which | 1222 | * based cpu-clock-tick sw counter, which |
@@ -1231,7 +1233,7 @@ try_again: | |||
1231 | goto try_again; | 1233 | goto try_again; |
1232 | } | 1234 | } |
1233 | printf("\n"); | 1235 | printf("\n"); |
1234 | error("perfcounter syscall returned with %d (%s)\n", | 1236 | error("sys_perf_event_open() syscall returned with %d (%s). /bin/dmesg may provide additional information.\n", |
1235 | fd[i][counter][thread_index], strerror(err)); | 1237 | fd[i][counter][thread_index], strerror(err)); |
1236 | die("No CONFIG_PERF_EVENTS=y kernel support configured?\n"); | 1238 | die("No CONFIG_PERF_EVENTS=y kernel support configured?\n"); |
1237 | exit(-1); | 1239 | exit(-1); |