diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2017-01-24 11:44:10 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2017-01-27 10:23:33 -0500 |
commit | ecc4c5614b24ee8ebaa35b834b5768dc9302ee3e (patch) | |
tree | 31817740c14db1542afc1d9eb11cf0619eaeff77 /tools | |
parent | afc45cf52c93009f1f4432e50365ce294ba7a474 (diff) |
perf tools: Propagate perf_config() errors
Previously these were being ignored, sometimes silently.
Stop doing that, emitting debug messages and handling the errors.
Testing it:
$ cat ~/.perfconfig
cat: /home/acme/.perfconfig: No such file or directory
$ perf stat -e cycles usleep 1
Performance counter stats for 'usleep 1':
938,996 cycles:u
0.003813731 seconds time elapsed
$ perf top --stdio
Error:
You may not have permission to collect system-wide stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid,
<SNIP>
[ perf record: Captured and wrote 0.019 MB perf.data (7 samples) ]
[acme@jouet linux]$ perf report --stdio
# To display the perf.data header info, please use --header/--header-only options.
# Overhead Command Shared Object Symbol
# ........ ....... ................. .........................
71.77% usleep libc-2.24.so [.] _dl_addr
27.07% usleep ld-2.24.so [.] _dl_next_ld_env_entry
1.13% usleep [kernel.kallsyms] [k] page_fault
$
$ touch ~/.perfconfig
$ ls -la ~/.perfconfig
-rw-rw-r--. 1 acme acme 0 Jan 27 12:14 /home/acme/.perfconfig
$
$ perf stat -e instructions usleep 1
Performance counter stats for 'usleep 1':
244,610 instructions:u
0.000805383 seconds time elapsed
$
[root@jouet ~]# chown acme.acme ~/.perfconfig
[root@jouet ~]# perf stat -e cycles usleep 1
Warning: File /root/.perfconfig not owned by current user or root, ignoring it.
Performance counter stats for 'usleep 1':
937,615 cycles
0.000836931 seconds time elapsed
#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-j2rq96so6xdqlr8p8rd6a3jx@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/builtin-help.c | 6 | ||||
-rw-r--r-- | tools/perf/builtin-kmem.c | 8 | ||||
-rw-r--r-- | tools/perf/builtin-record.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-top.c | 4 | ||||
-rw-r--r-- | tools/perf/perf.c | 15 | ||||
-rw-r--r-- | tools/perf/util/callchain.c | 16 | ||||
-rw-r--r-- | tools/perf/util/config.c | 9 | ||||
-rw-r--r-- | tools/perf/util/data-convert-bt.c | 7 | ||||
-rw-r--r-- | tools/perf/util/hist.c | 4 | ||||
-rw-r--r-- | tools/perf/util/intel-pt.c | 4 | ||||
-rw-r--r-- | tools/perf/util/llvm-utils.c | 4 |
12 files changed, 62 insertions, 23 deletions
diff --git a/tools/perf/builtin-help.c b/tools/perf/builtin-help.c index 93da24a638be..aed0d844e8c2 100644 --- a/tools/perf/builtin-help.c +++ b/tools/perf/builtin-help.c | |||
@@ -447,11 +447,13 @@ int cmd_help(int argc, const char **argv, const char *prefix __maybe_unused) | |||
447 | NULL | 447 | NULL |
448 | }; | 448 | }; |
449 | const char *alias; | 449 | const char *alias; |
450 | int rc = 0; | 450 | int rc; |
451 | 451 | ||
452 | load_command_list("perf-", &main_cmds, &other_cmds); | 452 | load_command_list("perf-", &main_cmds, &other_cmds); |
453 | 453 | ||
454 | perf_config(perf_help_config, &help_format); | 454 | rc = perf_config(perf_help_config, &help_format); |
455 | if (rc) | ||
456 | return rc; | ||
455 | 457 | ||
456 | argc = parse_options_subcommand(argc, argv, builtin_help_options, | 458 | argc = parse_options_subcommand(argc, argv, builtin_help_options, |
457 | builtin_help_subcommands, builtin_help_usage, 0); | 459 | builtin_help_subcommands, builtin_help_usage, 0); |
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 915869e00d86..29f4751a3574 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -1920,10 +1920,12 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused) | |||
1920 | NULL | 1920 | NULL |
1921 | }; | 1921 | }; |
1922 | struct perf_session *session; | 1922 | struct perf_session *session; |
1923 | int ret = -1; | ||
1924 | const char errmsg[] = "No %s allocation events found. Have you run 'perf kmem record --%s'?\n"; | 1923 | const char errmsg[] = "No %s allocation events found. Have you run 'perf kmem record --%s'?\n"; |
1924 | int ret = perf_config(kmem_config, NULL); | ||
1925 | |||
1926 | if (ret) | ||
1927 | return ret; | ||
1925 | 1928 | ||
1926 | perf_config(kmem_config, NULL); | ||
1927 | argc = parse_options_subcommand(argc, argv, kmem_options, | 1929 | argc = parse_options_subcommand(argc, argv, kmem_options, |
1928 | kmem_subcommands, kmem_usage, 0); | 1930 | kmem_subcommands, kmem_usage, 0); |
1929 | 1931 | ||
@@ -1948,6 +1950,8 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused) | |||
1948 | if (session == NULL) | 1950 | if (session == NULL) |
1949 | return -1; | 1951 | return -1; |
1950 | 1952 | ||
1953 | ret = -1; | ||
1954 | |||
1951 | if (kmem_slab) { | 1955 | if (kmem_slab) { |
1952 | if (!perf_evlist__find_tracepoint_by_name(session->evlist, | 1956 | if (!perf_evlist__find_tracepoint_by_name(session->evlist, |
1953 | "kmem:kmalloc")) { | 1957 | "kmem:kmalloc")) { |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 33a9eaaf9db4..ffac8ca9fb01 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -1670,7 +1670,9 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused) | |||
1670 | if (rec->evlist == NULL) | 1670 | if (rec->evlist == NULL) |
1671 | return -ENOMEM; | 1671 | return -ENOMEM; |
1672 | 1672 | ||
1673 | perf_config(perf_record_config, rec); | 1673 | err = perf_config(perf_record_config, rec); |
1674 | if (err) | ||
1675 | return err; | ||
1674 | 1676 | ||
1675 | argc = parse_options(argc, argv, record_options, record_usage, | 1677 | argc = parse_options(argc, argv, record_options, record_usage, |
1676 | PARSE_OPT_STOP_AT_NON_OPTION); | 1678 | PARSE_OPT_STOP_AT_NON_OPTION); |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 06cc759a4597..dbd7fa028861 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -847,7 +847,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) | |||
847 | if (ret < 0) | 847 | if (ret < 0) |
848 | return ret; | 848 | return ret; |
849 | 849 | ||
850 | perf_config(report__config, &report); | 850 | ret = perf_config(report__config, &report); |
851 | if (ret) | ||
852 | return ret; | ||
851 | 853 | ||
852 | argc = parse_options(argc, argv, options, report_usage, 0); | 854 | argc = parse_options(argc, argv, options, report_usage, 0); |
853 | if (argc) { | 855 | if (argc) { |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 3df4178ba378..20aef9815cd8 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -1216,7 +1216,9 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) | |||
1216 | if (top.evlist == NULL) | 1216 | if (top.evlist == NULL) |
1217 | return -ENOMEM; | 1217 | return -ENOMEM; |
1218 | 1218 | ||
1219 | perf_config(perf_top_config, &top); | 1219 | status = perf_config(perf_top_config, &top); |
1220 | if (status) | ||
1221 | return status; | ||
1220 | 1222 | ||
1221 | argc = parse_options(argc, argv, options, top_usage, 0); | 1223 | argc = parse_options(argc, argv, options, top_usage, 0); |
1222 | if (argc) | 1224 | if (argc) |
diff --git a/tools/perf/perf.c b/tools/perf/perf.c index 34bcf90f8871..6d5479e03e0d 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c | |||
@@ -90,11 +90,12 @@ static int pager_command_config(const char *var, const char *value, void *data) | |||
90 | /* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */ | 90 | /* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */ |
91 | int check_pager_config(const char *cmd) | 91 | int check_pager_config(const char *cmd) |
92 | { | 92 | { |
93 | int err; | ||
93 | struct pager_config c; | 94 | struct pager_config c; |
94 | c.cmd = cmd; | 95 | c.cmd = cmd; |
95 | c.val = -1; | 96 | c.val = -1; |
96 | perf_config(pager_command_config, &c); | 97 | err = perf_config(pager_command_config, &c); |
97 | return c.val; | 98 | return err ?: c.val; |
98 | } | 99 | } |
99 | 100 | ||
100 | static int browser_command_config(const char *var, const char *value, void *data) | 101 | static int browser_command_config(const char *var, const char *value, void *data) |
@@ -113,11 +114,12 @@ static int browser_command_config(const char *var, const char *value, void *data | |||
113 | */ | 114 | */ |
114 | static int check_browser_config(const char *cmd) | 115 | static int check_browser_config(const char *cmd) |
115 | { | 116 | { |
117 | int err; | ||
116 | struct pager_config c; | 118 | struct pager_config c; |
117 | c.cmd = cmd; | 119 | c.cmd = cmd; |
118 | c.val = -1; | 120 | c.val = -1; |
119 | perf_config(browser_command_config, &c); | 121 | err = perf_config(browser_command_config, &c); |
120 | return c.val; | 122 | return err ?: c.val; |
121 | } | 123 | } |
122 | 124 | ||
123 | static void commit_pager_choice(void) | 125 | static void commit_pager_choice(void) |
@@ -509,6 +511,7 @@ static void cache_line_size(int *cacheline_sizep) | |||
509 | 511 | ||
510 | int main(int argc, const char **argv) | 512 | int main(int argc, const char **argv) |
511 | { | 513 | { |
514 | int err; | ||
512 | const char *cmd; | 515 | const char *cmd; |
513 | char sbuf[STRERR_BUFSIZE]; | 516 | char sbuf[STRERR_BUFSIZE]; |
514 | int value; | 517 | int value; |
@@ -534,7 +537,9 @@ int main(int argc, const char **argv) | |||
534 | srandom(time(NULL)); | 537 | srandom(time(NULL)); |
535 | 538 | ||
536 | perf_config__init(); | 539 | perf_config__init(); |
537 | perf_config(perf_default_config, NULL); | 540 | err = perf_config(perf_default_config, NULL); |
541 | if (err) | ||
542 | return err; | ||
538 | set_buildid_dir(NULL); | 543 | set_buildid_dir(NULL); |
539 | 544 | ||
540 | /* get debugfs/tracefs mount point from /proc/mounts */ | 545 | /* get debugfs/tracefs mount point from /proc/mounts */ |
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 42922512c1c6..e16db30dfe40 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c | |||
@@ -48,6 +48,8 @@ static int parse_callchain_mode(const char *value) | |||
48 | callchain_param.mode = CHAIN_FOLDED; | 48 | callchain_param.mode = CHAIN_FOLDED; |
49 | return 0; | 49 | return 0; |
50 | } | 50 | } |
51 | |||
52 | pr_err("Invalid callchain mode: %s\n", value); | ||
51 | return -1; | 53 | return -1; |
52 | } | 54 | } |
53 | 55 | ||
@@ -63,6 +65,8 @@ static int parse_callchain_order(const char *value) | |||
63 | callchain_param.order_set = true; | 65 | callchain_param.order_set = true; |
64 | return 0; | 66 | return 0; |
65 | } | 67 | } |
68 | |||
69 | pr_err("Invalid callchain order: %s\n", value); | ||
66 | return -1; | 70 | return -1; |
67 | } | 71 | } |
68 | 72 | ||
@@ -80,6 +84,8 @@ static int parse_callchain_sort_key(const char *value) | |||
80 | callchain_param.branch_callstack = 1; | 84 | callchain_param.branch_callstack = 1; |
81 | return 0; | 85 | return 0; |
82 | } | 86 | } |
87 | |||
88 | pr_err("Invalid callchain sort key: %s\n", value); | ||
83 | return -1; | 89 | return -1; |
84 | } | 90 | } |
85 | 91 | ||
@@ -97,6 +103,8 @@ static int parse_callchain_value(const char *value) | |||
97 | callchain_param.value = CCVAL_COUNT; | 103 | callchain_param.value = CCVAL_COUNT; |
98 | return 0; | 104 | return 0; |
99 | } | 105 | } |
106 | |||
107 | pr_err("Invalid callchain config key: %s\n", value); | ||
100 | return -1; | 108 | return -1; |
101 | } | 109 | } |
102 | 110 | ||
@@ -210,13 +218,17 @@ int perf_callchain_config(const char *var, const char *value) | |||
210 | return parse_callchain_sort_key(value); | 218 | return parse_callchain_sort_key(value); |
211 | if (!strcmp(var, "threshold")) { | 219 | if (!strcmp(var, "threshold")) { |
212 | callchain_param.min_percent = strtod(value, &endptr); | 220 | callchain_param.min_percent = strtod(value, &endptr); |
213 | if (value == endptr) | 221 | if (value == endptr) { |
222 | pr_err("Invalid callchain threshold: %s\n", value); | ||
214 | return -1; | 223 | return -1; |
224 | } | ||
215 | } | 225 | } |
216 | if (!strcmp(var, "print-limit")) { | 226 | if (!strcmp(var, "print-limit")) { |
217 | callchain_param.print_limit = strtod(value, &endptr); | 227 | callchain_param.print_limit = strtod(value, &endptr); |
218 | if (value == endptr) | 228 | if (value == endptr) { |
229 | pr_err("Invalid callchain print limit: %s\n", value); | ||
219 | return -1; | 230 | return -1; |
231 | } | ||
220 | } | 232 | } |
221 | 233 | ||
222 | return 0; | 234 | return 0; |
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c index 615e8b4a693b..0c7d5a4975cd 100644 --- a/tools/perf/util/config.c +++ b/tools/perf/util/config.c | |||
@@ -386,8 +386,10 @@ static int perf_buildid_config(const char *var, const char *value) | |||
386 | if (!strcmp(var, "buildid.dir")) { | 386 | if (!strcmp(var, "buildid.dir")) { |
387 | const char *dir = perf_config_dirname(var, value); | 387 | const char *dir = perf_config_dirname(var, value); |
388 | 388 | ||
389 | if (!dir) | 389 | if (!dir) { |
390 | pr_err("Invalid buildid directory!\n"); | ||
390 | return -1; | 391 | return -1; |
392 | } | ||
391 | strncpy(buildid_dir, dir, MAXPATHLEN-1); | 393 | strncpy(buildid_dir, dir, MAXPATHLEN-1); |
392 | buildid_dir[MAXPATHLEN-1] = '\0'; | 394 | buildid_dir[MAXPATHLEN-1] = '\0'; |
393 | } | 395 | } |
@@ -405,10 +407,9 @@ static int perf_default_core_config(const char *var __maybe_unused, | |||
405 | static int perf_ui_config(const char *var, const char *value) | 407 | static int perf_ui_config(const char *var, const char *value) |
406 | { | 408 | { |
407 | /* Add other config variables here. */ | 409 | /* Add other config variables here. */ |
408 | if (!strcmp(var, "ui.show-headers")) { | 410 | if (!strcmp(var, "ui.show-headers")) |
409 | symbol_conf.show_hist_headers = perf_config_bool(var, value); | 411 | symbol_conf.show_hist_headers = perf_config_bool(var, value); |
410 | return 0; | 412 | |
411 | } | ||
412 | return 0; | 413 | return 0; |
413 | } | 414 | } |
414 | 415 | ||
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c index 7123f4de32cc..4e6cbc99f08e 100644 --- a/tools/perf/util/data-convert-bt.c +++ b/tools/perf/util/data-convert-bt.c | |||
@@ -1473,7 +1473,7 @@ int bt_convert__perf2ctf(const char *input, const char *path, | |||
1473 | }, | 1473 | }, |
1474 | }; | 1474 | }; |
1475 | struct ctf_writer *cw = &c.writer; | 1475 | struct ctf_writer *cw = &c.writer; |
1476 | int err = -1; | 1476 | int err; |
1477 | 1477 | ||
1478 | if (opts->all) { | 1478 | if (opts->all) { |
1479 | c.tool.comm = process_comm_event; | 1479 | c.tool.comm = process_comm_event; |
@@ -1481,12 +1481,15 @@ int bt_convert__perf2ctf(const char *input, const char *path, | |||
1481 | c.tool.fork = process_fork_event; | 1481 | c.tool.fork = process_fork_event; |
1482 | } | 1482 | } |
1483 | 1483 | ||
1484 | perf_config(convert__config, &c); | 1484 | err = perf_config(convert__config, &c); |
1485 | if (err) | ||
1486 | return err; | ||
1485 | 1487 | ||
1486 | /* CTF writer */ | 1488 | /* CTF writer */ |
1487 | if (ctf_writer__init(cw, path)) | 1489 | if (ctf_writer__init(cw, path)) |
1488 | return -1; | 1490 | return -1; |
1489 | 1491 | ||
1492 | err = -1; | ||
1490 | /* perf.data session */ | 1493 | /* perf.data session */ |
1491 | session = perf_session__new(&file, 0, &c.tool); | 1494 | session = perf_session__new(&file, 0, &c.tool); |
1492 | if (!session) | 1495 | if (!session) |
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 6770a9645609..cff2e9041b15 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
@@ -2439,8 +2439,10 @@ int parse_filter_percentage(const struct option *opt __maybe_unused, | |||
2439 | symbol_conf.filter_relative = true; | 2439 | symbol_conf.filter_relative = true; |
2440 | else if (!strcmp(arg, "absolute")) | 2440 | else if (!strcmp(arg, "absolute")) |
2441 | symbol_conf.filter_relative = false; | 2441 | symbol_conf.filter_relative = false; |
2442 | else | 2442 | else { |
2443 | pr_debug("Invalud percentage: %s\n", arg); | ||
2443 | return -1; | 2444 | return -1; |
2445 | } | ||
2444 | 2446 | ||
2445 | return 0; | 2447 | return 0; |
2446 | } | 2448 | } |
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c index 85d5eeb66c75..da20cd5612e9 100644 --- a/tools/perf/util/intel-pt.c +++ b/tools/perf/util/intel-pt.c | |||
@@ -2159,7 +2159,9 @@ int intel_pt_process_auxtrace_info(union perf_event *event, | |||
2159 | 2159 | ||
2160 | addr_filters__init(&pt->filts); | 2160 | addr_filters__init(&pt->filts); |
2161 | 2161 | ||
2162 | perf_config(intel_pt_perf_config, pt); | 2162 | err = perf_config(intel_pt_perf_config, pt); |
2163 | if (err) | ||
2164 | goto err_free; | ||
2163 | 2165 | ||
2164 | err = auxtrace_queues__init(&pt->queues); | 2166 | err = auxtrace_queues__init(&pt->queues); |
2165 | if (err) | 2167 | if (err) |
diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c index b23ff44cf214..824356488ce6 100644 --- a/tools/perf/util/llvm-utils.c +++ b/tools/perf/util/llvm-utils.c | |||
@@ -48,8 +48,10 @@ int perf_llvm_config(const char *var, const char *value) | |||
48 | llvm_param.kbuild_opts = strdup(value); | 48 | llvm_param.kbuild_opts = strdup(value); |
49 | else if (!strcmp(var, "dump-obj")) | 49 | else if (!strcmp(var, "dump-obj")) |
50 | llvm_param.dump_obj = !!perf_config_bool(var, value); | 50 | llvm_param.dump_obj = !!perf_config_bool(var, value); |
51 | else | 51 | else { |
52 | pr_debug("Invalid LLVM config option: %s\n", value); | ||
52 | return -1; | 53 | return -1; |
54 | } | ||
53 | llvm_param.user_set_param = true; | 55 | llvm_param.user_set_param = true; |
54 | return 0; | 56 | return 0; |
55 | } | 57 | } |