aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2014-08-18 04:14:43 -0400
committerIngo Molnar <mingo@kernel.org>2014-08-18 04:14:43 -0400
commitaf924aa35129edf338ebc8da6a4eae08cf7cb297 (patch)
tree45417e729d0b4f0a346963f6b76e34687df2aa5a
parentf373da34282560c60f0c197690eecb1b2dc49fc0 (diff)
parent759e612bf96627b64fcafe4174b3f6f2dedf2c0d (diff)
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo: User visible changes: * Warn user to rebuild target with debuginfo in 'perf probe' (Masami Hiramatsu) * Don't truncate Intel style addresses in 'annotate'. (Alex Converse) Infrastructure changes: * Annotate PMU related list_head members with type info. (Cody P Schafer) * Add the triplet used for arm64 by Android (Elliott Hughes) * Replace thread unsafe strerror() with strerror_r() accross the whole tools/perf/ tree (Masami Hiramatsu) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--tools/perf/arch/common.c9
-rw-r--r--tools/perf/builtin-buildid-cache.c7
-rw-r--r--tools/perf/builtin-help.c20
-rw-r--r--tools/perf/builtin-kvm.c7
-rw-r--r--tools/perf/builtin-probe.c5
-rw-r--r--tools/perf/builtin-record.c7
-rw-r--r--tools/perf/builtin-sched.c4
-rw-r--r--tools/perf/builtin-stat.c2
-rw-r--r--tools/perf/builtin-top.c2
-rw-r--r--tools/perf/builtin-trace.c6
-rw-r--r--tools/perf/perf.c10
-rw-r--r--tools/perf/tests/builtin-test.c4
-rw-r--r--tools/perf/tests/mmap-basic.c7
-rw-r--r--tools/perf/tests/open-syscall-all-cpus.c5
-rw-r--r--tools/perf/tests/open-syscall-tp-fields.c7
-rw-r--r--tools/perf/tests/open-syscall.c3
-rw-r--r--tools/perf/tests/perf-record.c13
-rw-r--r--tools/perf/tests/rdpmc.c6
-rw-r--r--tools/perf/tests/sw-clock.c6
-rw-r--r--tools/perf/tests/task-exit.c6
-rw-r--r--tools/perf/util/annotate.c12
-rw-r--r--tools/perf/util/callchain.c95
-rw-r--r--tools/perf/util/cloexec.c6
-rw-r--r--tools/perf/util/data.c8
-rw-r--r--tools/perf/util/debug.h3
-rw-r--r--tools/perf/util/dso.c8
-rw-r--r--tools/perf/util/evlist.c2
-rw-r--r--tools/perf/util/evsel.c7
-rw-r--r--tools/perf/util/parse-events.c5
-rw-r--r--tools/perf/util/pmu.c4
-rw-r--r--tools/perf/util/pmu.h6
-rw-r--r--tools/perf/util/probe-event.c75
-rw-r--r--tools/perf/util/probe-finder.c7
-rw-r--r--tools/perf/util/run-command.c9
-rw-r--r--tools/perf/util/util.c5
35 files changed, 234 insertions, 154 deletions
diff --git a/tools/perf/arch/common.c b/tools/perf/arch/common.c
index 42faf369211c..49776f190abf 100644
--- a/tools/perf/arch/common.c
+++ b/tools/perf/arch/common.c
@@ -12,6 +12,11 @@ const char *const arm_triplets[] = {
12 NULL 12 NULL
13}; 13};
14 14
15const char *const arm64_triplets[] = {
16 "aarch64-linux-android-",
17 NULL
18};
19
15const char *const powerpc_triplets[] = { 20const char *const powerpc_triplets[] = {
16 "powerpc-unknown-linux-gnu-", 21 "powerpc-unknown-linux-gnu-",
17 "powerpc64-unknown-linux-gnu-", 22 "powerpc64-unknown-linux-gnu-",
@@ -105,6 +110,8 @@ static const char *normalize_arch(char *arch)
105 return "x86"; 110 return "x86";
106 if (!strcmp(arch, "sun4u") || !strncmp(arch, "sparc", 5)) 111 if (!strcmp(arch, "sun4u") || !strncmp(arch, "sparc", 5))
107 return "sparc"; 112 return "sparc";
113 if (!strcmp(arch, "aarch64") || !strcmp(arch, "arm64"))
114 return "arm64";
108 if (!strncmp(arch, "arm", 3) || !strcmp(arch, "sa110")) 115 if (!strncmp(arch, "arm", 3) || !strcmp(arch, "sa110"))
109 return "arm"; 116 return "arm";
110 if (!strncmp(arch, "s390", 4)) 117 if (!strncmp(arch, "s390", 4))
@@ -159,6 +166,8 @@ static int perf_session_env__lookup_binutils_path(struct perf_session_env *env,
159 166
160 if (!strcmp(arch, "arm")) 167 if (!strcmp(arch, "arm"))
161 path_list = arm_triplets; 168 path_list = arm_triplets;
169 else if (!strcmp(arch, "arm64"))
170 path_list = arm64_triplets;
162 else if (!strcmp(arch, "powerpc")) 171 else if (!strcmp(arch, "powerpc"))
163 path_list = powerpc_triplets; 172 path_list = powerpc_triplets;
164 else if (!strcmp(arch, "sh")) 173 else if (!strcmp(arch, "sh"))
diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildid-cache.c
index ac5838e0b1bd..70385756da63 100644
--- a/tools/perf/builtin-buildid-cache.c
+++ b/tools/perf/builtin-buildid-cache.c
@@ -291,6 +291,7 @@ int cmd_buildid_cache(int argc, const char **argv,
291 *missing_filename = NULL, 291 *missing_filename = NULL,
292 *update_name_list_str = NULL, 292 *update_name_list_str = NULL,
293 *kcore_filename; 293 *kcore_filename;
294 char sbuf[STRERR_BUFSIZE];
294 295
295 struct perf_data_file file = { 296 struct perf_data_file file = {
296 .mode = PERF_DATA_MODE_READ, 297 .mode = PERF_DATA_MODE_READ,
@@ -347,7 +348,7 @@ int cmd_buildid_cache(int argc, const char **argv,
347 continue; 348 continue;
348 } 349 }
349 pr_warning("Couldn't add %s: %s\n", 350 pr_warning("Couldn't add %s: %s\n",
350 pos->s, strerror(errno)); 351 pos->s, strerror_r(errno, sbuf, sizeof(sbuf)));
351 } 352 }
352 353
353 strlist__delete(list); 354 strlist__delete(list);
@@ -365,7 +366,7 @@ int cmd_buildid_cache(int argc, const char **argv,
365 continue; 366 continue;
366 } 367 }
367 pr_warning("Couldn't remove %s: %s\n", 368 pr_warning("Couldn't remove %s: %s\n",
368 pos->s, strerror(errno)); 369 pos->s, strerror_r(errno, sbuf, sizeof(sbuf)));
369 } 370 }
370 371
371 strlist__delete(list); 372 strlist__delete(list);
@@ -386,7 +387,7 @@ int cmd_buildid_cache(int argc, const char **argv,
386 continue; 387 continue;
387 } 388 }
388 pr_warning("Couldn't update %s: %s\n", 389 pr_warning("Couldn't update %s: %s\n",
389 pos->s, strerror(errno)); 390 pos->s, strerror_r(errno, sbuf, sizeof(sbuf)));
390 } 391 }
391 392
392 strlist__delete(list); 393 strlist__delete(list);
diff --git a/tools/perf/builtin-help.c b/tools/perf/builtin-help.c
index 0384d930480b..25d20628212e 100644
--- a/tools/perf/builtin-help.c
+++ b/tools/perf/builtin-help.c
@@ -103,6 +103,8 @@ static int check_emacsclient_version(void)
103 103
104static void exec_woman_emacs(const char *path, const char *page) 104static void exec_woman_emacs(const char *path, const char *page)
105{ 105{
106 char sbuf[STRERR_BUFSIZE];
107
106 if (!check_emacsclient_version()) { 108 if (!check_emacsclient_version()) {
107 /* This works only with emacsclient version >= 22. */ 109 /* This works only with emacsclient version >= 22. */
108 struct strbuf man_page = STRBUF_INIT; 110 struct strbuf man_page = STRBUF_INIT;
@@ -111,16 +113,19 @@ static void exec_woman_emacs(const char *path, const char *page)
111 path = "emacsclient"; 113 path = "emacsclient";
112 strbuf_addf(&man_page, "(woman \"%s\")", page); 114 strbuf_addf(&man_page, "(woman \"%s\")", page);
113 execlp(path, "emacsclient", "-e", man_page.buf, NULL); 115 execlp(path, "emacsclient", "-e", man_page.buf, NULL);
114 warning("failed to exec '%s': %s", path, strerror(errno)); 116 warning("failed to exec '%s': %s", path,
117 strerror_r(errno, sbuf, sizeof(sbuf)));
115 } 118 }
116} 119}
117 120
118static void exec_man_konqueror(const char *path, const char *page) 121static void exec_man_konqueror(const char *path, const char *page)
119{ 122{
120 const char *display = getenv("DISPLAY"); 123 const char *display = getenv("DISPLAY");
124
121 if (display && *display) { 125 if (display && *display) {
122 struct strbuf man_page = STRBUF_INIT; 126 struct strbuf man_page = STRBUF_INIT;
123 const char *filename = "kfmclient"; 127 const char *filename = "kfmclient";
128 char sbuf[STRERR_BUFSIZE];
124 129
125 /* It's simpler to launch konqueror using kfmclient. */ 130 /* It's simpler to launch konqueror using kfmclient. */
126 if (path) { 131 if (path) {
@@ -139,24 +144,31 @@ static void exec_man_konqueror(const char *path, const char *page)
139 path = "kfmclient"; 144 path = "kfmclient";
140 strbuf_addf(&man_page, "man:%s(1)", page); 145 strbuf_addf(&man_page, "man:%s(1)", page);
141 execlp(path, filename, "newTab", man_page.buf, NULL); 146 execlp(path, filename, "newTab", man_page.buf, NULL);
142 warning("failed to exec '%s': %s", path, strerror(errno)); 147 warning("failed to exec '%s': %s", path,
148 strerror_r(errno, sbuf, sizeof(sbuf)));
143 } 149 }
144} 150}
145 151
146static void exec_man_man(const char *path, const char *page) 152static void exec_man_man(const char *path, const char *page)
147{ 153{
154 char sbuf[STRERR_BUFSIZE];
155
148 if (!path) 156 if (!path)
149 path = "man"; 157 path = "man";
150 execlp(path, "man", page, NULL); 158 execlp(path, "man", page, NULL);
151 warning("failed to exec '%s': %s", path, strerror(errno)); 159 warning("failed to exec '%s': %s", path,
160 strerror_r(errno, sbuf, sizeof(sbuf)));
152} 161}
153 162
154static void exec_man_cmd(const char *cmd, const char *page) 163static void exec_man_cmd(const char *cmd, const char *page)
155{ 164{
156 struct strbuf shell_cmd = STRBUF_INIT; 165 struct strbuf shell_cmd = STRBUF_INIT;
166 char sbuf[STRERR_BUFSIZE];
167
157 strbuf_addf(&shell_cmd, "%s %s", cmd, page); 168 strbuf_addf(&shell_cmd, "%s %s", cmd, page);
158 execl("/bin/sh", "sh", "-c", shell_cmd.buf, NULL); 169 execl("/bin/sh", "sh", "-c", shell_cmd.buf, NULL);
159 warning("failed to exec '%s': %s", cmd, strerror(errno)); 170 warning("failed to exec '%s': %s", cmd,
171 strerror_r(errno, sbuf, sizeof(sbuf)));
160} 172}
161 173
162static void add_man_viewer(const char *name) 174static void add_man_viewer(const char *name)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 14d03edc81c2..1a4ef9cd9d5f 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -990,6 +990,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
990 int err, rc = -1; 990 int err, rc = -1;
991 struct perf_evsel *pos; 991 struct perf_evsel *pos;
992 struct perf_evlist *evlist = kvm->evlist; 992 struct perf_evlist *evlist = kvm->evlist;
993 char sbuf[STRERR_BUFSIZE];
993 994
994 perf_evlist__config(evlist, &kvm->opts); 995 perf_evlist__config(evlist, &kvm->opts);
995 996
@@ -1026,12 +1027,14 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
1026 1027
1027 err = perf_evlist__open(evlist); 1028 err = perf_evlist__open(evlist);
1028 if (err < 0) { 1029 if (err < 0) {
1029 printf("Couldn't create the events: %s\n", strerror(errno)); 1030 printf("Couldn't create the events: %s\n",
1031 strerror_r(errno, sbuf, sizeof(sbuf)));
1030 goto out; 1032 goto out;
1031 } 1033 }
1032 1034
1033 if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) { 1035 if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) {
1034 ui__error("Failed to mmap the events: %s\n", strerror(errno)); 1036 ui__error("Failed to mmap the events: %s\n",
1037 strerror_r(errno, sbuf, sizeof(sbuf)));
1035 perf_evlist__close(evlist); 1038 perf_evlist__close(evlist);
1036 goto out; 1039 goto out;
1037 } 1040 }
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index c63fa2925075..347729e29a92 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -290,8 +290,11 @@ static void cleanup_params(void)
290 290
291static void pr_err_with_code(const char *msg, int err) 291static void pr_err_with_code(const char *msg, int err)
292{ 292{
293 char sbuf[STRERR_BUFSIZE];
294
293 pr_err("%s", msg); 295 pr_err("%s", msg);
294 pr_debug(" Reason: %s (Code: %d)", strerror(-err), err); 296 pr_debug(" Reason: %s (Code: %d)",
297 strerror_r(-err, sbuf, sizeof(sbuf)), err);
295 pr_err("\n"); 298 pr_err("\n");
296} 299}
297 300
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 4db670d4b8da..87e28a4e33ba 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -161,7 +161,7 @@ try_again:
161 161
162 if (perf_evlist__apply_filters(evlist)) { 162 if (perf_evlist__apply_filters(evlist)) {
163 error("failed to set filter with %d (%s)\n", errno, 163 error("failed to set filter with %d (%s)\n", errno,
164 strerror(errno)); 164 strerror_r(errno, msg, sizeof(msg)));
165 rc = -1; 165 rc = -1;
166 goto out; 166 goto out;
167 } 167 }
@@ -175,7 +175,8 @@ try_again:
175 "(current value: %u)\n", opts->mmap_pages); 175 "(current value: %u)\n", opts->mmap_pages);
176 rc = -errno; 176 rc = -errno;
177 } else { 177 } else {
178 pr_err("failed to mmap with %d (%s)\n", errno, strerror(errno)); 178 pr_err("failed to mmap with %d (%s)\n", errno,
179 strerror_r(errno, msg, sizeof(msg)));
179 rc = -errno; 180 rc = -errno;
180 } 181 }
181 goto out; 182 goto out;
@@ -480,7 +481,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
480 } 481 }
481 482
482 if (forks && workload_exec_errno) { 483 if (forks && workload_exec_errno) {
483 char msg[512]; 484 char msg[STRERR_BUFSIZE];
484 const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg)); 485 const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg));
485 pr_err("Workload failed: %s\n", emsg); 486 pr_err("Workload failed: %s\n", emsg);
486 err = -1; 487 err = -1;
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index f5874a27b346..9c9287fbf8e9 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -428,6 +428,7 @@ static u64 get_cpu_usage_nsec_parent(void)
428static int self_open_counters(void) 428static int self_open_counters(void)
429{ 429{
430 struct perf_event_attr attr; 430 struct perf_event_attr attr;
431 char sbuf[STRERR_BUFSIZE];
431 int fd; 432 int fd;
432 433
433 memset(&attr, 0, sizeof(attr)); 434 memset(&attr, 0, sizeof(attr));
@@ -440,7 +441,8 @@ static int self_open_counters(void)
440 441
441 if (fd < 0) 442 if (fd < 0)
442 pr_err("Error: sys_perf_event_open() syscall returned " 443 pr_err("Error: sys_perf_event_open() syscall returned "
443 "with %d (%s)\n", fd, strerror(errno)); 444 "with %d (%s)\n", fd,
445 strerror_r(errno, sbuf, sizeof(sbuf)));
444 return fd; 446 return fd;
445} 447}
446 448
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 3e80aa10cfd8..5fe0edb1de5d 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -593,7 +593,7 @@ static int __run_perf_stat(int argc, const char **argv)
593 593
594 if (perf_evlist__apply_filters(evsel_list)) { 594 if (perf_evlist__apply_filters(evsel_list)) {
595 error("failed to set filter with %d (%s)\n", errno, 595 error("failed to set filter with %d (%s)\n", errno,
596 strerror(errno)); 596 strerror_r(errno, msg, sizeof(msg)));
597 return -1; 597 return -1;
598 } 598 }
599 599
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 87a6615a40fa..a77ff6ca5fbd 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -899,7 +899,7 @@ try_again:
899 899
900 if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) { 900 if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) {
901 ui__error("Failed to mmap with %d (%s)\n", 901 ui__error("Failed to mmap with %d (%s)\n",
902 errno, strerror(errno)); 902 errno, strerror_r(errno, msg, sizeof(msg)));
903 goto out_err; 903 goto out_err;
904 } 904 }
905 905
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index d080b9cf0354..a9e96ff49c7f 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1750,7 +1750,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
1750signed_print: 1750signed_print:
1751 fprintf(trace->output, ") = %d", ret); 1751 fprintf(trace->output, ") = %d", ret);
1752 } else if (ret < 0 && sc->fmt->errmsg) { 1752 } else if (ret < 0 && sc->fmt->errmsg) {
1753 char bf[256]; 1753 char bf[STRERR_BUFSIZE];
1754 const char *emsg = strerror_r(-ret, bf, sizeof(bf)), 1754 const char *emsg = strerror_r(-ret, bf, sizeof(bf)),
1755 *e = audit_errno_to_name(-ret); 1755 *e = audit_errno_to_name(-ret);
1756 1756
@@ -2044,6 +2044,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
2044 int err = -1, i; 2044 int err = -1, i;
2045 unsigned long before; 2045 unsigned long before;
2046 const bool forks = argc > 0; 2046 const bool forks = argc > 0;
2047 char sbuf[STRERR_BUFSIZE];
2047 2048
2048 trace->live = true; 2049 trace->live = true;
2049 2050
@@ -2105,7 +2106,8 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
2105 2106
2106 err = perf_evlist__mmap(evlist, trace->opts.mmap_pages, false); 2107 err = perf_evlist__mmap(evlist, trace->opts.mmap_pages, false);
2107 if (err < 0) { 2108 if (err < 0) {
2108 fprintf(trace->output, "Couldn't mmap the events: %s\n", strerror(errno)); 2109 fprintf(trace->output, "Couldn't mmap the events: %s\n",
2110 strerror_r(errno, sbuf, sizeof(sbuf)));
2109 goto out_delete_evlist; 2111 goto out_delete_evlist;
2110 } 2112 }
2111 2113
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 2282d41879a2..452a8474d29d 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -313,6 +313,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
313 int status; 313 int status;
314 struct stat st; 314 struct stat st;
315 const char *prefix; 315 const char *prefix;
316 char sbuf[STRERR_BUFSIZE];
316 317
317 prefix = NULL; 318 prefix = NULL;
318 if (p->option & RUN_SETUP) 319 if (p->option & RUN_SETUP)
@@ -343,7 +344,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
343 status = 1; 344 status = 1;
344 /* Check for ENOSPC and EIO errors.. */ 345 /* Check for ENOSPC and EIO errors.. */
345 if (fflush(stdout)) { 346 if (fflush(stdout)) {
346 fprintf(stderr, "write failure on standard output: %s", strerror(errno)); 347 fprintf(stderr, "write failure on standard output: %s",
348 strerror_r(errno, sbuf, sizeof(sbuf)));
347 goto out; 349 goto out;
348 } 350 }
349 if (ferror(stdout)) { 351 if (ferror(stdout)) {
@@ -351,7 +353,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
351 goto out; 353 goto out;
352 } 354 }
353 if (fclose(stdout)) { 355 if (fclose(stdout)) {
354 fprintf(stderr, "close failed on standard output: %s", strerror(errno)); 356 fprintf(stderr, "close failed on standard output: %s",
357 strerror_r(errno, sbuf, sizeof(sbuf)));
355 goto out; 358 goto out;
356 } 359 }
357 status = 0; 360 status = 0;
@@ -466,6 +469,7 @@ void pthread__unblock_sigwinch(void)
466int main(int argc, const char **argv) 469int main(int argc, const char **argv)
467{ 470{
468 const char *cmd; 471 const char *cmd;
472 char sbuf[STRERR_BUFSIZE];
469 473
470 /* The page_size is placed in util object. */ 474 /* The page_size is placed in util object. */
471 page_size = sysconf(_SC_PAGE_SIZE); 475 page_size = sysconf(_SC_PAGE_SIZE);
@@ -561,7 +565,7 @@ int main(int argc, const char **argv)
561 } 565 }
562 566
563 fprintf(stderr, "Failed to run command '%s': %s\n", 567 fprintf(stderr, "Failed to run command '%s': %s\n",
564 cmd, strerror(errno)); 568 cmd, strerror_r(errno, sbuf, sizeof(sbuf)));
565out: 569out:
566 return 1; 570 return 1;
567} 571}
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index c6796d22423a..99481361b19f 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -185,9 +185,11 @@ static bool perf_test__matches(int curr, int argc, const char *argv[])
185static int run_test(struct test *test) 185static int run_test(struct test *test)
186{ 186{
187 int status, err = -1, child = fork(); 187 int status, err = -1, child = fork();
188 char sbuf[STRERR_BUFSIZE];
188 189
189 if (child < 0) { 190 if (child < 0) {
190 pr_err("failed to fork test: %s\n", strerror(errno)); 191 pr_err("failed to fork test: %s\n",
192 strerror_r(errno, sbuf, sizeof(sbuf)));
191 return -1; 193 return -1;
192 } 194 }
193 195
diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c
index 142263492f6f..9b9622a33932 100644
--- a/tools/perf/tests/mmap-basic.c
+++ b/tools/perf/tests/mmap-basic.c
@@ -31,6 +31,7 @@ int test__basic_mmap(void)
31 unsigned int nr_events[nsyscalls], 31 unsigned int nr_events[nsyscalls],
32 expected_nr_events[nsyscalls], i, j; 32 expected_nr_events[nsyscalls], i, j;
33 struct perf_evsel *evsels[nsyscalls], *evsel; 33 struct perf_evsel *evsels[nsyscalls], *evsel;
34 char sbuf[STRERR_BUFSIZE];
34 35
35 threads = thread_map__new(-1, getpid(), UINT_MAX); 36 threads = thread_map__new(-1, getpid(), UINT_MAX);
36 if (threads == NULL) { 37 if (threads == NULL) {
@@ -49,7 +50,7 @@ int test__basic_mmap(void)
49 sched_setaffinity(0, sizeof(cpu_set), &cpu_set); 50 sched_setaffinity(0, sizeof(cpu_set), &cpu_set);
50 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) { 51 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
51 pr_debug("sched_setaffinity() failed on CPU %d: %s ", 52 pr_debug("sched_setaffinity() failed on CPU %d: %s ",
52 cpus->map[0], strerror(errno)); 53 cpus->map[0], strerror_r(errno, sbuf, sizeof(sbuf)));
53 goto out_free_cpus; 54 goto out_free_cpus;
54 } 55 }
55 56
@@ -79,7 +80,7 @@ int test__basic_mmap(void)
79 if (perf_evsel__open(evsels[i], cpus, threads) < 0) { 80 if (perf_evsel__open(evsels[i], cpus, threads) < 0) {
80 pr_debug("failed to open counter: %s, " 81 pr_debug("failed to open counter: %s, "
81 "tweak /proc/sys/kernel/perf_event_paranoid?\n", 82 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
82 strerror(errno)); 83 strerror_r(errno, sbuf, sizeof(sbuf)));
83 goto out_delete_evlist; 84 goto out_delete_evlist;
84 } 85 }
85 86
@@ -89,7 +90,7 @@ int test__basic_mmap(void)
89 90
90 if (perf_evlist__mmap(evlist, 128, true) < 0) { 91 if (perf_evlist__mmap(evlist, 128, true) < 0) {
91 pr_debug("failed to mmap events: %d (%s)\n", errno, 92 pr_debug("failed to mmap events: %d (%s)\n", errno,
92 strerror(errno)); 93 strerror_r(errno, sbuf, sizeof(sbuf)));
93 goto out_delete_evlist; 94 goto out_delete_evlist;
94 } 95 }
95 96
diff --git a/tools/perf/tests/open-syscall-all-cpus.c b/tools/perf/tests/open-syscall-all-cpus.c
index 5fecdbd2f5f7..8fa82d1700c7 100644
--- a/tools/perf/tests/open-syscall-all-cpus.c
+++ b/tools/perf/tests/open-syscall-all-cpus.c
@@ -12,6 +12,7 @@ int test__open_syscall_event_on_all_cpus(void)
12 unsigned int nr_open_calls = 111, i; 12 unsigned int nr_open_calls = 111, i;
13 cpu_set_t cpu_set; 13 cpu_set_t cpu_set;
14 struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX); 14 struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
15 char sbuf[STRERR_BUFSIZE];
15 16
16 if (threads == NULL) { 17 if (threads == NULL) {
17 pr_debug("thread_map__new\n"); 18 pr_debug("thread_map__new\n");
@@ -35,7 +36,7 @@ int test__open_syscall_event_on_all_cpus(void)
35 if (perf_evsel__open(evsel, cpus, threads) < 0) { 36 if (perf_evsel__open(evsel, cpus, threads) < 0) {
36 pr_debug("failed to open counter: %s, " 37 pr_debug("failed to open counter: %s, "
37 "tweak /proc/sys/kernel/perf_event_paranoid?\n", 38 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
38 strerror(errno)); 39 strerror_r(errno, sbuf, sizeof(sbuf)));
39 goto out_evsel_delete; 40 goto out_evsel_delete;
40 } 41 }
41 42
@@ -56,7 +57,7 @@ int test__open_syscall_event_on_all_cpus(void)
56 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) { 57 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
57 pr_debug("sched_setaffinity() failed on CPU %d: %s ", 58 pr_debug("sched_setaffinity() failed on CPU %d: %s ",
58 cpus->map[cpu], 59 cpus->map[cpu],
59 strerror(errno)); 60 strerror_r(errno, sbuf, sizeof(sbuf)));
60 goto out_close_fd; 61 goto out_close_fd;
61 } 62 }
62 for (i = 0; i < ncalls; ++i) { 63 for (i = 0; i < ncalls; ++i) {
diff --git a/tools/perf/tests/open-syscall-tp-fields.c b/tools/perf/tests/open-syscall-tp-fields.c
index 0785b64ffd6c..922bdb627950 100644
--- a/tools/perf/tests/open-syscall-tp-fields.c
+++ b/tools/perf/tests/open-syscall-tp-fields.c
@@ -22,6 +22,7 @@ int test__syscall_open_tp_fields(void)
22 struct perf_evlist *evlist = perf_evlist__new(); 22 struct perf_evlist *evlist = perf_evlist__new();
23 struct perf_evsel *evsel; 23 struct perf_evsel *evsel;
24 int err = -1, i, nr_events = 0, nr_polls = 0; 24 int err = -1, i, nr_events = 0, nr_polls = 0;
25 char sbuf[STRERR_BUFSIZE];
25 26
26 if (evlist == NULL) { 27 if (evlist == NULL) {
27 pr_debug("%s: perf_evlist__new\n", __func__); 28 pr_debug("%s: perf_evlist__new\n", __func__);
@@ -48,13 +49,15 @@ int test__syscall_open_tp_fields(void)
48 49
49 err = perf_evlist__open(evlist); 50 err = perf_evlist__open(evlist);
50 if (err < 0) { 51 if (err < 0) {
51 pr_debug("perf_evlist__open: %s\n", strerror(errno)); 52 pr_debug("perf_evlist__open: %s\n",
53 strerror_r(errno, sbuf, sizeof(sbuf)));
52 goto out_delete_evlist; 54 goto out_delete_evlist;
53 } 55 }
54 56
55 err = perf_evlist__mmap(evlist, UINT_MAX, false); 57 err = perf_evlist__mmap(evlist, UINT_MAX, false);
56 if (err < 0) { 58 if (err < 0) {
57 pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); 59 pr_debug("perf_evlist__mmap: %s\n",
60 strerror_r(errno, sbuf, sizeof(sbuf)));
58 goto out_delete_evlist; 61 goto out_delete_evlist;
59 } 62 }
60 63
diff --git a/tools/perf/tests/open-syscall.c b/tools/perf/tests/open-syscall.c
index c1dc7d25f38c..a33b2daae40f 100644
--- a/tools/perf/tests/open-syscall.c
+++ b/tools/perf/tests/open-syscall.c
@@ -9,6 +9,7 @@ int test__open_syscall_event(void)
9 struct perf_evsel *evsel; 9 struct perf_evsel *evsel;
10 unsigned int nr_open_calls = 111, i; 10 unsigned int nr_open_calls = 111, i;
11 struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX); 11 struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
12 char sbuf[STRERR_BUFSIZE];
12 13
13 if (threads == NULL) { 14 if (threads == NULL) {
14 pr_debug("thread_map__new\n"); 15 pr_debug("thread_map__new\n");
@@ -24,7 +25,7 @@ int test__open_syscall_event(void)
24 if (perf_evsel__open_per_thread(evsel, threads) < 0) { 25 if (perf_evsel__open_per_thread(evsel, threads) < 0) {
25 pr_debug("failed to open counter: %s, " 26 pr_debug("failed to open counter: %s, "
26 "tweak /proc/sys/kernel/perf_event_paranoid?\n", 27 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
27 strerror(errno)); 28 strerror_r(errno, sbuf, sizeof(sbuf)));
28 goto out_evsel_delete; 29 goto out_evsel_delete;
29 } 30 }
30 31
diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c
index aca1a83dd13a..2ce753c1db63 100644
--- a/tools/perf/tests/perf-record.c
+++ b/tools/perf/tests/perf-record.c
@@ -59,6 +59,7 @@ int test__PERF_RECORD(void)
59 int err = -1, errs = 0, i, wakeups = 0; 59 int err = -1, errs = 0, i, wakeups = 0;
60 u32 cpu; 60 u32 cpu;
61 int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, }; 61 int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, };
62 char sbuf[STRERR_BUFSIZE];
62 63
63 if (evlist == NULL || argv == NULL) { 64 if (evlist == NULL || argv == NULL) {
64 pr_debug("Not enough memory to create evlist\n"); 65 pr_debug("Not enough memory to create evlist\n");
@@ -100,7 +101,8 @@ int test__PERF_RECORD(void)
100 101
101 err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); 102 err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
102 if (err < 0) { 103 if (err < 0) {
103 pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno)); 104 pr_debug("sched__get_first_possible_cpu: %s\n",
105 strerror_r(errno, sbuf, sizeof(sbuf)));
104 goto out_delete_evlist; 106 goto out_delete_evlist;
105 } 107 }
106 108
@@ -110,7 +112,8 @@ int test__PERF_RECORD(void)
110 * So that we can check perf_sample.cpu on all the samples. 112 * So that we can check perf_sample.cpu on all the samples.
111 */ 113 */
112 if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { 114 if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) {
113 pr_debug("sched_setaffinity: %s\n", strerror(errno)); 115 pr_debug("sched_setaffinity: %s\n",
116 strerror_r(errno, sbuf, sizeof(sbuf)));
114 goto out_delete_evlist; 117 goto out_delete_evlist;
115 } 118 }
116 119
@@ -120,7 +123,8 @@ int test__PERF_RECORD(void)
120 */ 123 */
121 err = perf_evlist__open(evlist); 124 err = perf_evlist__open(evlist);
122 if (err < 0) { 125 if (err < 0) {
123 pr_debug("perf_evlist__open: %s\n", strerror(errno)); 126 pr_debug("perf_evlist__open: %s\n",
127 strerror_r(errno, sbuf, sizeof(sbuf)));
124 goto out_delete_evlist; 128 goto out_delete_evlist;
125 } 129 }
126 130
@@ -131,7 +135,8 @@ int test__PERF_RECORD(void)
131 */ 135 */
132 err = perf_evlist__mmap(evlist, opts.mmap_pages, false); 136 err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
133 if (err < 0) { 137 if (err < 0) {
134 pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); 138 pr_debug("perf_evlist__mmap: %s\n",
139 strerror_r(errno, sbuf, sizeof(sbuf)));
135 goto out_delete_evlist; 140 goto out_delete_evlist;
136 } 141 }
137 142
diff --git a/tools/perf/tests/rdpmc.c b/tools/perf/tests/rdpmc.c
index c04d1f268576..d31f2c4d9f64 100644
--- a/tools/perf/tests/rdpmc.c
+++ b/tools/perf/tests/rdpmc.c
@@ -100,6 +100,7 @@ static int __test__rdpmc(void)
100 }; 100 };
101 u64 delta_sum = 0; 101 u64 delta_sum = 0;
102 struct sigaction sa; 102 struct sigaction sa;
103 char sbuf[STRERR_BUFSIZE];
103 104
104 sigfillset(&sa.sa_mask); 105 sigfillset(&sa.sa_mask);
105 sa.sa_sigaction = segfault_handler; 106 sa.sa_sigaction = segfault_handler;
@@ -109,14 +110,15 @@ static int __test__rdpmc(void)
109 perf_event_open_cloexec_flag()); 110 perf_event_open_cloexec_flag());
110 if (fd < 0) { 111 if (fd < 0) {
111 pr_err("Error: sys_perf_event_open() syscall returned " 112 pr_err("Error: sys_perf_event_open() syscall returned "
112 "with %d (%s)\n", fd, strerror(errno)); 113 "with %d (%s)\n", fd,
114 strerror_r(errno, sbuf, sizeof(sbuf)));
113 return -1; 115 return -1;
114 } 116 }
115 117
116 addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0); 118 addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0);
117 if (addr == (void *)(-1)) { 119 if (addr == (void *)(-1)) {
118 pr_err("Error: mmap() syscall returned with (%s)\n", 120 pr_err("Error: mmap() syscall returned with (%s)\n",
119 strerror(errno)); 121 strerror_r(errno, sbuf, sizeof(sbuf)));
120 goto out_close; 122 goto out_close;
121 } 123 }
122 124
diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c
index 983d6b8562a8..1aa21c90731b 100644
--- a/tools/perf/tests/sw-clock.c
+++ b/tools/perf/tests/sw-clock.c
@@ -22,6 +22,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
22 volatile int tmp = 0; 22 volatile int tmp = 0;
23 u64 total_periods = 0; 23 u64 total_periods = 0;
24 int nr_samples = 0; 24 int nr_samples = 0;
25 char sbuf[STRERR_BUFSIZE];
25 union perf_event *event; 26 union perf_event *event;
26 struct perf_evsel *evsel; 27 struct perf_evsel *evsel;
27 struct perf_evlist *evlist; 28 struct perf_evlist *evlist;
@@ -62,14 +63,15 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
62 63
63 err = -errno; 64 err = -errno;
64 pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n", 65 pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n",
65 strerror(errno), knob, (u64)attr.sample_freq); 66 strerror_r(errno, sbuf, sizeof(sbuf)),
67 knob, (u64)attr.sample_freq);
66 goto out_delete_evlist; 68 goto out_delete_evlist;
67 } 69 }
68 70
69 err = perf_evlist__mmap(evlist, 128, true); 71 err = perf_evlist__mmap(evlist, 128, true);
70 if (err < 0) { 72 if (err < 0) {
71 pr_debug("failed to mmap event: %d (%s)\n", errno, 73 pr_debug("failed to mmap event: %d (%s)\n", errno,
72 strerror(errno)); 74 strerror_r(errno, sbuf, sizeof(sbuf)));
73 goto out_delete_evlist; 75 goto out_delete_evlist;
74 } 76 }
75 77
diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c
index 5ff3db318f12..87522f01c7ad 100644
--- a/tools/perf/tests/task-exit.c
+++ b/tools/perf/tests/task-exit.c
@@ -42,6 +42,7 @@ int test__task_exit(void)
42 .uses_mmap = true, 42 .uses_mmap = true,
43 }; 43 };
44 const char *argv[] = { "true", NULL }; 44 const char *argv[] = { "true", NULL };
45 char sbuf[STRERR_BUFSIZE];
45 46
46 signal(SIGCHLD, sig_handler); 47 signal(SIGCHLD, sig_handler);
47 48
@@ -82,13 +83,14 @@ int test__task_exit(void)
82 83
83 err = perf_evlist__open(evlist); 84 err = perf_evlist__open(evlist);
84 if (err < 0) { 85 if (err < 0) {
85 pr_debug("Couldn't open the evlist: %s\n", strerror(-err)); 86 pr_debug("Couldn't open the evlist: %s\n",
87 strerror_r(-err, sbuf, sizeof(sbuf)));
86 goto out_delete_evlist; 88 goto out_delete_evlist;
87 } 89 }
88 90
89 if (perf_evlist__mmap(evlist, 128, true) < 0) { 91 if (perf_evlist__mmap(evlist, 128, true) < 0) {
90 pr_debug("failed to mmap events: %d (%s)\n", errno, 92 pr_debug("failed to mmap events: %d (%s)\n", errno,
91 strerror(errno)); 93 strerror_r(errno, sbuf, sizeof(sbuf)));
92 goto out_delete_evlist; 94 goto out_delete_evlist;
93 } 95 }
94 96
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 7745fec01a6b..36437527dbb3 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -232,9 +232,16 @@ static int mov__parse(struct ins_operands *ops)
232 return -1; 232 return -1;
233 233
234 target = ++s; 234 target = ++s;
235 comment = strchr(s, '#');
235 236
236 while (s[0] != '\0' && !isspace(s[0])) 237 if (comment != NULL)
237 ++s; 238 s = comment - 1;
239 else
240 s = strchr(s, '\0') - 1;
241
242 while (s > target && isspace(s[0]))
243 --s;
244 s++;
238 prev = *s; 245 prev = *s;
239 *s = '\0'; 246 *s = '\0';
240 247
@@ -244,7 +251,6 @@ static int mov__parse(struct ins_operands *ops)
244 if (ops->target.raw == NULL) 251 if (ops->target.raw == NULL)
245 goto out_free_source; 252 goto out_free_source;
246 253
247 comment = strchr(s, '#');
248 if (comment == NULL) 254 if (comment == NULL)
249 return 0; 255 return 0;
250 256
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 437ee09727e6..08f0fbf5527c 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -28,74 +28,55 @@ __thread struct callchain_cursor callchain_cursor;
28int 28int
29parse_callchain_report_opt(const char *arg) 29parse_callchain_report_opt(const char *arg)
30{ 30{
31 char *tok, *tok2; 31 char *tok;
32 char *endptr; 32 char *endptr;
33 bool minpcnt_set = false;
33 34
34 symbol_conf.use_callchain = true; 35 symbol_conf.use_callchain = true;
35 36
36 if (!arg) 37 if (!arg)
37 return 0; 38 return 0;
38 39
39 tok = strtok((char *)arg, ","); 40 while ((tok = strtok((char *)arg, ",")) != NULL) {
40 if (!tok) 41 if (!strncmp(tok, "none", strlen(tok))) {
41 return -1; 42 callchain_param.mode = CHAIN_NONE;
42 43 symbol_conf.use_callchain = false;
43 /* get the output mode */ 44 return 0;
44 if (!strncmp(tok, "graph", strlen(arg))) { 45 }
45 callchain_param.mode = CHAIN_GRAPH_ABS;
46
47 } else if (!strncmp(tok, "flat", strlen(arg))) {
48 callchain_param.mode = CHAIN_FLAT;
49 } else if (!strncmp(tok, "fractal", strlen(arg))) {
50 callchain_param.mode = CHAIN_GRAPH_REL;
51 } else if (!strncmp(tok, "none", strlen(arg))) {
52 callchain_param.mode = CHAIN_NONE;
53 symbol_conf.use_callchain = false;
54 return 0;
55 } else {
56 return -1;
57 }
58
59 /* get the min percentage */
60 tok = strtok(NULL, ",");
61 if (!tok)
62 goto setup;
63
64 callchain_param.min_percent = strtod(tok, &endptr);
65 if (tok == endptr)
66 return -1;
67 46
68 /* get the print limit */ 47 /* try to get the output mode */
69 tok2 = strtok(NULL, ","); 48 if (!strncmp(tok, "graph", strlen(tok)))
70 if (!tok2) 49 callchain_param.mode = CHAIN_GRAPH_ABS;
71 goto setup; 50 else if (!strncmp(tok, "flat", strlen(tok)))
51 callchain_param.mode = CHAIN_FLAT;
52 else if (!strncmp(tok, "fractal", strlen(tok)))
53 callchain_param.mode = CHAIN_GRAPH_REL;
54 /* try to get the call chain order */
55 else if (!strncmp(tok, "caller", strlen(tok)))
56 callchain_param.order = ORDER_CALLER;
57 else if (!strncmp(tok, "callee", strlen(tok)))
58 callchain_param.order = ORDER_CALLEE;
59 /* try to get the sort key */
60 else if (!strncmp(tok, "function", strlen(tok)))
61 callchain_param.key = CCKEY_FUNCTION;
62 else if (!strncmp(tok, "address", strlen(tok)))
63 callchain_param.key = CCKEY_ADDRESS;
64 /* try to get the min percent */
65 else if (!minpcnt_set) {
66 callchain_param.min_percent = strtod(tok, &endptr);
67 if (tok == endptr)
68 return -1;
69 minpcnt_set = true;
70 } else {
71 /* try print limit at last */
72 callchain_param.print_limit = strtoul(tok, &endptr, 0);
73 if (tok == endptr)
74 return -1;
75 }
72 76
73 if (tok2[0] != 'c') { 77 arg = NULL;
74 callchain_param.print_limit = strtoul(tok2, &endptr, 0);
75 tok2 = strtok(NULL, ",");
76 if (!tok2)
77 goto setup;
78 } 78 }
79 79
80 /* get the call chain order */
81 if (!strncmp(tok2, "caller", strlen("caller")))
82 callchain_param.order = ORDER_CALLER;
83 else if (!strncmp(tok2, "callee", strlen("callee")))
84 callchain_param.order = ORDER_CALLEE;
85 else
86 return -1;
87
88 /* Get the sort key */
89 tok2 = strtok(NULL, ",");
90 if (!tok2)
91 goto setup;
92 if (!strncmp(tok2, "function", strlen("function")))
93 callchain_param.key = CCKEY_FUNCTION;
94 else if (!strncmp(tok2, "address", strlen("address")))
95 callchain_param.key = CCKEY_ADDRESS;
96 else
97 return -1;
98setup:
99 if (callchain_register_param(&callchain_param) < 0) { 80 if (callchain_register_param(&callchain_param) < 0) {
100 pr_err("Can't register callchain params\n"); 81 pr_err("Can't register callchain params\n");
101 return -1; 82 return -1;
diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c
index 4945aa56a017..47b78b3f0325 100644
--- a/tools/perf/util/cloexec.c
+++ b/tools/perf/util/cloexec.c
@@ -3,6 +3,7 @@
3#include "../perf.h" 3#include "../perf.h"
4#include "cloexec.h" 4#include "cloexec.h"
5#include "asm/bug.h" 5#include "asm/bug.h"
6#include "debug.h"
6 7
7static unsigned long flag = PERF_FLAG_FD_CLOEXEC; 8static unsigned long flag = PERF_FLAG_FD_CLOEXEC;
8 9
@@ -18,6 +19,7 @@ static int perf_flag_probe(void)
18 int err; 19 int err;
19 int cpu; 20 int cpu;
20 pid_t pid = -1; 21 pid_t pid = -1;
22 char sbuf[STRERR_BUFSIZE];
21 23
22 cpu = sched_getcpu(); 24 cpu = sched_getcpu();
23 if (cpu < 0) 25 if (cpu < 0)
@@ -42,7 +44,7 @@ static int perf_flag_probe(void)
42 44
43 WARN_ONCE(err != EINVAL && err != EBUSY, 45 WARN_ONCE(err != EINVAL && err != EBUSY,
44 "perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error %d (%s)\n", 46 "perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error %d (%s)\n",
45 err, strerror(err)); 47 err, strerror_r(err, sbuf, sizeof(sbuf)));
46 48
47 /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */ 49 /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */
48 fd = sys_perf_event_open(&attr, pid, cpu, -1, 0); 50 fd = sys_perf_event_open(&attr, pid, cpu, -1, 0);
@@ -50,7 +52,7 @@ static int perf_flag_probe(void)
50 52
51 if (WARN_ONCE(fd < 0 && err != EBUSY, 53 if (WARN_ONCE(fd < 0 && err != EBUSY,
52 "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n", 54 "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n",
53 err, strerror(err))) 55 err, strerror_r(err, sbuf, sizeof(sbuf))))
54 return -1; 56 return -1;
55 57
56 close(fd); 58 close(fd);
diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c
index 29d720cf5844..1921942fc2e0 100644
--- a/tools/perf/util/data.c
+++ b/tools/perf/util/data.c
@@ -50,12 +50,14 @@ static int open_file_read(struct perf_data_file *file)
50{ 50{
51 struct stat st; 51 struct stat st;
52 int fd; 52 int fd;
53 char sbuf[STRERR_BUFSIZE];
53 54
54 fd = open(file->path, O_RDONLY); 55 fd = open(file->path, O_RDONLY);
55 if (fd < 0) { 56 if (fd < 0) {
56 int err = errno; 57 int err = errno;
57 58
58 pr_err("failed to open %s: %s", file->path, strerror(err)); 59 pr_err("failed to open %s: %s", file->path,
60 strerror_r(err, sbuf, sizeof(sbuf)));
59 if (err == ENOENT && !strcmp(file->path, "perf.data")) 61 if (err == ENOENT && !strcmp(file->path, "perf.data"))
60 pr_err(" (try 'perf record' first)"); 62 pr_err(" (try 'perf record' first)");
61 pr_err("\n"); 63 pr_err("\n");
@@ -88,6 +90,7 @@ static int open_file_read(struct perf_data_file *file)
88static int open_file_write(struct perf_data_file *file) 90static int open_file_write(struct perf_data_file *file)
89{ 91{
90 int fd; 92 int fd;
93 char sbuf[STRERR_BUFSIZE];
91 94
92 if (check_backup(file)) 95 if (check_backup(file))
93 return -1; 96 return -1;
@@ -95,7 +98,8 @@ static int open_file_write(struct perf_data_file *file)
95 fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR); 98 fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
96 99
97 if (fd < 0) 100 if (fd < 0)
98 pr_err("failed to open %s : %s\n", file->path, strerror(errno)); 101 pr_err("failed to open %s : %s\n", file->path,
102 strerror_r(errno, sbuf, sizeof(sbuf)));
99 103
100 return fd; 104 return fd;
101} 105}
diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
index 6944ea3a119b..be264d6f3b30 100644
--- a/tools/perf/util/debug.h
+++ b/tools/perf/util/debug.h
@@ -3,6 +3,7 @@
3#define __PERF_DEBUG_H 3#define __PERF_DEBUG_H
4 4
5#include <stdbool.h> 5#include <stdbool.h>
6#include <string.h>
6#include "event.h" 7#include "event.h"
7#include "../ui/helpline.h" 8#include "../ui/helpline.h"
8#include "../ui/progress.h" 9#include "../ui/progress.h"
@@ -36,6 +37,8 @@ extern int debug_ordered_events;
36#define pr_oe_time(t, fmt, ...) pr_time_N(1, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__) 37#define pr_oe_time(t, fmt, ...) pr_time_N(1, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__)
37#define pr_oe_time2(t, fmt, ...) pr_time_N(2, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__) 38#define pr_oe_time2(t, fmt, ...) pr_time_N(2, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__)
38 39
40#define STRERR_BUFSIZE 128 /* For the buffer size of strerror_r */
41
39int dump_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); 42int dump_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
40void trace_event(union perf_event *event); 43void trace_event(union perf_event *event);
41 44
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index bdafd306fb52..55e39dc1bcda 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -162,13 +162,15 @@ static void close_first_dso(void);
162static int do_open(char *name) 162static int do_open(char *name)
163{ 163{
164 int fd; 164 int fd;
165 char sbuf[STRERR_BUFSIZE];
165 166
166 do { 167 do {
167 fd = open(name, O_RDONLY); 168 fd = open(name, O_RDONLY);
168 if (fd >= 0) 169 if (fd >= 0)
169 return fd; 170 return fd;
170 171
171 pr_debug("dso open failed, mmap: %s\n", strerror(errno)); 172 pr_debug("dso open failed, mmap: %s\n",
173 strerror_r(errno, sbuf, sizeof(sbuf)));
172 if (!dso__data_open_cnt || errno != EMFILE) 174 if (!dso__data_open_cnt || errno != EMFILE)
173 break; 175 break;
174 176
@@ -530,10 +532,12 @@ static ssize_t cached_read(struct dso *dso, u64 offset, u8 *data, ssize_t size)
530static int data_file_size(struct dso *dso) 532static int data_file_size(struct dso *dso)
531{ 533{
532 struct stat st; 534 struct stat st;
535 char sbuf[STRERR_BUFSIZE];
533 536
534 if (!dso->data.file_size) { 537 if (!dso->data.file_size) {
535 if (fstat(dso->data.fd, &st)) { 538 if (fstat(dso->data.fd, &st)) {
536 pr_err("dso mmap failed, fstat: %s\n", strerror(errno)); 539 pr_err("dso mmap failed, fstat: %s\n",
540 strerror_r(errno, sbuf, sizeof(sbuf)));
537 return -1; 541 return -1;
538 } 542 }
539 dso->data.file_size = st.st_size; 543 dso->data.file_size = st.st_size;
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 5dcd28c79c6e..a3e28b49128a 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -1295,7 +1295,7 @@ int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused,
1295 int err, char *buf, size_t size) 1295 int err, char *buf, size_t size)
1296{ 1296{
1297 int printed, value; 1297 int printed, value;
1298 char sbuf[128], *emsg = strerror_r(err, sbuf, sizeof(sbuf)); 1298 char sbuf[STRERR_BUFSIZE], *emsg = strerror_r(err, sbuf, sizeof(sbuf));
1299 1299
1300 switch (err) { 1300 switch (err) {
1301 case EACCES: 1301 case EACCES:
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 01ce14c3575e..b38de5819323 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2027,6 +2027,8 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
2027int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, 2027int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
2028 int err, char *msg, size_t size) 2028 int err, char *msg, size_t size)
2029{ 2029{
2030 char sbuf[STRERR_BUFSIZE];
2031
2030 switch (err) { 2032 switch (err) {
2031 case EPERM: 2033 case EPERM:
2032 case EACCES: 2034 case EACCES:
@@ -2072,8 +2074,9 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
2072 } 2074 }
2073 2075
2074 return scnprintf(msg, size, 2076 return scnprintf(msg, size,
2075 "The sys_perf_event_open() syscall returned with %d (%s) for event (%s). \n" 2077 "The sys_perf_event_open() syscall returned with %d (%s) for event (%s).\n"
2076 "/bin/dmesg may provide additional information.\n" 2078 "/bin/dmesg may provide additional information.\n"
2077 "No CONFIG_PERF_EVENTS=y kernel support configured?\n", 2079 "No CONFIG_PERF_EVENTS=y kernel support configured?\n",
2078 err, strerror(err), perf_evsel__name(evsel)); 2080 err, strerror_r(err, sbuf, sizeof(sbuf)),
2081 perf_evsel__name(evsel));
2079} 2082}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 1e15df10a88c..e34c81a0bcf3 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -10,6 +10,7 @@
10#include "symbol.h" 10#include "symbol.h"
11#include "cache.h" 11#include "cache.h"
12#include "header.h" 12#include "header.h"
13#include "debug.h"
13#include <api/fs/debugfs.h> 14#include <api/fs/debugfs.h>
14#include "parse-events-bison.h" 15#include "parse-events-bison.h"
15#define YY_EXTRA_TYPE int 16#define YY_EXTRA_TYPE int
@@ -1006,9 +1007,11 @@ void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
1006 struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; 1007 struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
1007 char evt_path[MAXPATHLEN]; 1008 char evt_path[MAXPATHLEN];
1008 char dir_path[MAXPATHLEN]; 1009 char dir_path[MAXPATHLEN];
1010 char sbuf[STRERR_BUFSIZE];
1009 1011
1010 if (debugfs_valid_mountpoint(tracing_events_path)) { 1012 if (debugfs_valid_mountpoint(tracing_events_path)) {
1011 printf(" [ Tracepoints not available: %s ]\n", strerror(errno)); 1013 printf(" [ Tracepoints not available: %s ]\n",
1014 strerror_r(errno, sbuf, sizeof(sbuf)));
1012 return; 1015 return;
1013 } 1016 }
1014 1017
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 7a811eb61f75..9bf582750561 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -14,8 +14,8 @@
14 14
15struct perf_pmu_alias { 15struct perf_pmu_alias {
16 char *name; 16 char *name;
17 struct list_head terms; 17 struct list_head terms; /* HEAD struct parse_events_term -> list */
18 struct list_head list; 18 struct list_head list; /* ELEM */
19 char unit[UNIT_MAX_LEN+1]; 19 char unit[UNIT_MAX_LEN+1];
20 double scale; 20 double scale;
21}; 21};
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index c14a543ce1f3..1c1e2eecbe1f 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -17,9 +17,9 @@ struct perf_pmu {
17 char *name; 17 char *name;
18 __u32 type; 18 __u32 type;
19 struct cpu_map *cpus; 19 struct cpu_map *cpus;
20 struct list_head format; 20 struct list_head format; /* HEAD struct perf_pmu_format -> list */
21 struct list_head aliases; 21 struct list_head aliases; /* HEAD struct perf_pmu_alias -> list */
22 struct list_head list; 22 struct list_head list; /* ELEM */
23}; 23};
24 24
25struct perf_pmu *perf_pmu__find(const char *name); 25struct perf_pmu *perf_pmu__find(const char *name);
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 784ea42ad8cb..f73595fc0627 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -258,21 +258,33 @@ static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs)
258#ifdef HAVE_DWARF_SUPPORT 258#ifdef HAVE_DWARF_SUPPORT
259 259
260/* Open new debuginfo of given module */ 260/* Open new debuginfo of given module */
261static struct debuginfo *open_debuginfo(const char *module) 261static struct debuginfo *open_debuginfo(const char *module, bool silent)
262{ 262{
263 const char *path = module; 263 const char *path = module;
264 struct debuginfo *ret;
264 265
265 if (!module || !strchr(module, '/')) { 266 if (!module || !strchr(module, '/')) {
266 path = kernel_get_module_path(module); 267 path = kernel_get_module_path(module);
267 if (!path) { 268 if (!path) {
268 pr_err("Failed to find path of %s module.\n", 269 if (!silent)
269 module ?: "kernel"); 270 pr_err("Failed to find path of %s module.\n",
271 module ?: "kernel");
270 return NULL; 272 return NULL;
271 } 273 }
272 } 274 }
273 return debuginfo__new(path); 275 ret = debuginfo__new(path);
276 if (!ret && !silent) {
277 pr_warning("The %s file has no debug information.\n", path);
278 if (!module || !strtailcmp(path, ".ko"))
279 pr_warning("Rebuild with CONFIG_DEBUG_INFO=y, ");
280 else
281 pr_warning("Rebuild with -g, ");
282 pr_warning("or install an appropriate debuginfo package.\n");
283 }
284 return ret;
274} 285}
275 286
287
276static int get_text_start_address(const char *exec, unsigned long *address) 288static int get_text_start_address(const char *exec, unsigned long *address)
277{ 289{
278 Elf *elf; 290 Elf *elf;
@@ -333,15 +345,13 @@ static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp,
333 pr_debug("try to find information at %" PRIx64 " in %s\n", addr, 345 pr_debug("try to find information at %" PRIx64 " in %s\n", addr,
334 tp->module ? : "kernel"); 346 tp->module ? : "kernel");
335 347
336 dinfo = open_debuginfo(tp->module); 348 dinfo = open_debuginfo(tp->module, verbose == 0);
337 if (dinfo) { 349 if (dinfo) {
338 ret = debuginfo__find_probe_point(dinfo, 350 ret = debuginfo__find_probe_point(dinfo,
339 (unsigned long)addr, pp); 351 (unsigned long)addr, pp);
340 debuginfo__delete(dinfo); 352 debuginfo__delete(dinfo);
341 } else { 353 } else
342 pr_debug("Failed to open debuginfo at 0x%" PRIx64 "\n", addr);
343 ret = -ENOENT; 354 ret = -ENOENT;
344 }
345 355
346 if (ret > 0) { 356 if (ret > 0) {
347 pp->retprobe = tp->retprobe; 357 pp->retprobe = tp->retprobe;
@@ -457,13 +467,11 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
457 struct debuginfo *dinfo; 467 struct debuginfo *dinfo;
458 int ntevs, ret = 0; 468 int ntevs, ret = 0;
459 469
460 dinfo = open_debuginfo(target); 470 dinfo = open_debuginfo(target, !need_dwarf);
461 471
462 if (!dinfo) { 472 if (!dinfo) {
463 if (need_dwarf) { 473 if (need_dwarf)
464 pr_warning("Failed to open debuginfo file.\n");
465 return -ENOENT; 474 return -ENOENT;
466 }
467 pr_debug("Could not open debuginfo. Try to use symbols.\n"); 475 pr_debug("Could not open debuginfo. Try to use symbols.\n");
468 return 0; 476 return 0;
469 } 477 }
@@ -565,7 +573,7 @@ static int get_real_path(const char *raw_path, const char *comp_dir,
565 573
566static int __show_one_line(FILE *fp, int l, bool skip, bool show_num) 574static int __show_one_line(FILE *fp, int l, bool skip, bool show_num)
567{ 575{
568 char buf[LINEBUF_SIZE]; 576 char buf[LINEBUF_SIZE], sbuf[STRERR_BUFSIZE];
569 const char *color = show_num ? "" : PERF_COLOR_BLUE; 577 const char *color = show_num ? "" : PERF_COLOR_BLUE;
570 const char *prefix = NULL; 578 const char *prefix = NULL;
571 579
@@ -585,7 +593,8 @@ static int __show_one_line(FILE *fp, int l, bool skip, bool show_num)
585 return 1; 593 return 1;
586error: 594error:
587 if (ferror(fp)) { 595 if (ferror(fp)) {
588 pr_warning("File read error: %s\n", strerror(errno)); 596 pr_warning("File read error: %s\n",
597 strerror_r(errno, sbuf, sizeof(sbuf)));
589 return -1; 598 return -1;
590 } 599 }
591 return 0; 600 return 0;
@@ -618,13 +627,12 @@ static int __show_line_range(struct line_range *lr, const char *module)
618 FILE *fp; 627 FILE *fp;
619 int ret; 628 int ret;
620 char *tmp; 629 char *tmp;
630 char sbuf[STRERR_BUFSIZE];
621 631
622 /* Search a line range */ 632 /* Search a line range */
623 dinfo = open_debuginfo(module); 633 dinfo = open_debuginfo(module, false);
624 if (!dinfo) { 634 if (!dinfo)
625 pr_warning("Failed to open debuginfo file.\n");
626 return -ENOENT; 635 return -ENOENT;
627 }
628 636
629 ret = debuginfo__find_line_range(dinfo, lr); 637 ret = debuginfo__find_line_range(dinfo, lr);
630 debuginfo__delete(dinfo); 638 debuginfo__delete(dinfo);
@@ -656,7 +664,7 @@ static int __show_line_range(struct line_range *lr, const char *module)
656 fp = fopen(lr->path, "r"); 664 fp = fopen(lr->path, "r");
657 if (fp == NULL) { 665 if (fp == NULL) {
658 pr_warning("Failed to open %s: %s\n", lr->path, 666 pr_warning("Failed to open %s: %s\n", lr->path,
659 strerror(errno)); 667 strerror_r(errno, sbuf, sizeof(sbuf)));
660 return -errno; 668 return -errno;
661 } 669 }
662 /* Skip to starting line number */ 670 /* Skip to starting line number */
@@ -772,9 +780,8 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs,
772 if (ret < 0) 780 if (ret < 0)
773 return ret; 781 return ret;
774 782
775 dinfo = open_debuginfo(module); 783 dinfo = open_debuginfo(module, false);
776 if (!dinfo) { 784 if (!dinfo) {
777 pr_warning("Failed to open debuginfo file.\n");
778 ret = -ENOENT; 785 ret = -ENOENT;
779 goto out; 786 goto out;
780 } 787 }
@@ -1405,8 +1412,7 @@ int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len)
1405 1412
1406 return tmp - buf; 1413 return tmp - buf;
1407error: 1414error:
1408 pr_debug("Failed to synthesize perf probe argument: %s\n", 1415 pr_debug("Failed to synthesize perf probe argument: %d\n", ret);
1409 strerror(-ret));
1410 return ret; 1416 return ret;
1411} 1417}
1412 1418
@@ -1455,8 +1461,7 @@ static char *synthesize_perf_probe_point(struct perf_probe_point *pp)
1455 1461
1456 return buf; 1462 return buf;
1457error: 1463error:
1458 pr_debug("Failed to synthesize perf probe point: %s\n", 1464 pr_debug("Failed to synthesize perf probe point: %d\n", ret);
1459 strerror(-ret));
1460 free(buf); 1465 free(buf);
1461 return NULL; 1466 return NULL;
1462} 1467}
@@ -1782,7 +1787,7 @@ static void clear_probe_trace_event(struct probe_trace_event *tev)
1782 1787
1783static void print_open_warning(int err, bool is_kprobe) 1788static void print_open_warning(int err, bool is_kprobe)
1784{ 1789{
1785 char sbuf[128]; 1790 char sbuf[STRERR_BUFSIZE];
1786 1791
1787 if (err == -ENOENT) { 1792 if (err == -ENOENT) {
1788 const char *config; 1793 const char *config;
@@ -1812,7 +1817,7 @@ static void print_both_open_warning(int kerr, int uerr)
1812 pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS " 1817 pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS "
1813 "or/and CONFIG_UPROBE_EVENTS.\n"); 1818 "or/and CONFIG_UPROBE_EVENTS.\n");
1814 else { 1819 else {
1815 char sbuf[128]; 1820 char sbuf[STRERR_BUFSIZE];
1816 pr_warning("Failed to open kprobe events: %s.\n", 1821 pr_warning("Failed to open kprobe events: %s.\n",
1817 strerror_r(-kerr, sbuf, sizeof(sbuf))); 1822 strerror_r(-kerr, sbuf, sizeof(sbuf)));
1818 pr_warning("Failed to open uprobe events: %s.\n", 1823 pr_warning("Failed to open uprobe events: %s.\n",
@@ -1876,7 +1881,7 @@ static struct strlist *get_probe_trace_command_rawlist(int fd)
1876 p[idx] = '\0'; 1881 p[idx] = '\0';
1877 ret = strlist__add(sl, buf); 1882 ret = strlist__add(sl, buf);
1878 if (ret < 0) { 1883 if (ret < 0) {
1879 pr_debug("strlist__add failed: %s\n", strerror(-ret)); 1884 pr_debug("strlist__add failed (%d)\n", ret);
1880 strlist__delete(sl); 1885 strlist__delete(sl);
1881 return NULL; 1886 return NULL;
1882 } 1887 }
@@ -1935,7 +1940,7 @@ static int __show_perf_probe_events(int fd, bool is_kprobe)
1935 1940
1936 rawlist = get_probe_trace_command_rawlist(fd); 1941 rawlist = get_probe_trace_command_rawlist(fd);
1937 if (!rawlist) 1942 if (!rawlist)
1938 return -ENOENT; 1943 return -ENOMEM;
1939 1944
1940 strlist__for_each(ent, rawlist) { 1945 strlist__for_each(ent, rawlist) {
1941 ret = parse_probe_trace_command(ent->s, &tev); 1946 ret = parse_probe_trace_command(ent->s, &tev);
@@ -2002,6 +2007,8 @@ static struct strlist *get_probe_trace_event_names(int fd, bool include_group)
2002 2007
2003 memset(&tev, 0, sizeof(tev)); 2008 memset(&tev, 0, sizeof(tev));
2004 rawlist = get_probe_trace_command_rawlist(fd); 2009 rawlist = get_probe_trace_command_rawlist(fd);
2010 if (!rawlist)
2011 return NULL;
2005 sl = strlist__new(true, NULL); 2012 sl = strlist__new(true, NULL);
2006 strlist__for_each(ent, rawlist) { 2013 strlist__for_each(ent, rawlist) {
2007 ret = parse_probe_trace_command(ent->s, &tev); 2014 ret = parse_probe_trace_command(ent->s, &tev);
@@ -2031,6 +2038,7 @@ static int write_probe_trace_event(int fd, struct probe_trace_event *tev)
2031{ 2038{
2032 int ret = 0; 2039 int ret = 0;
2033 char *buf = synthesize_probe_trace_command(tev); 2040 char *buf = synthesize_probe_trace_command(tev);
2041 char sbuf[STRERR_BUFSIZE];
2034 2042
2035 if (!buf) { 2043 if (!buf) {
2036 pr_debug("Failed to synthesize probe trace event.\n"); 2044 pr_debug("Failed to synthesize probe trace event.\n");
@@ -2042,7 +2050,7 @@ static int write_probe_trace_event(int fd, struct probe_trace_event *tev)
2042 ret = write(fd, buf, strlen(buf)); 2050 ret = write(fd, buf, strlen(buf));
2043 if (ret <= 0) 2051 if (ret <= 0)
2044 pr_warning("Failed to write event: %s\n", 2052 pr_warning("Failed to write event: %s\n",
2045 strerror(errno)); 2053 strerror_r(errno, sbuf, sizeof(sbuf)));
2046 } 2054 }
2047 free(buf); 2055 free(buf);
2048 return ret; 2056 return ret;
@@ -2056,7 +2064,7 @@ static int get_new_event_name(char *buf, size_t len, const char *base,
2056 /* Try no suffix */ 2064 /* Try no suffix */
2057 ret = e_snprintf(buf, len, "%s", base); 2065 ret = e_snprintf(buf, len, "%s", base);
2058 if (ret < 0) { 2066 if (ret < 0) {
2059 pr_debug("snprintf() failed: %s\n", strerror(-ret)); 2067 pr_debug("snprintf() failed: %d\n", ret);
2060 return ret; 2068 return ret;
2061 } 2069 }
2062 if (!strlist__has_entry(namelist, buf)) 2070 if (!strlist__has_entry(namelist, buf))
@@ -2072,7 +2080,7 @@ static int get_new_event_name(char *buf, size_t len, const char *base,
2072 for (i = 1; i < MAX_EVENT_INDEX; i++) { 2080 for (i = 1; i < MAX_EVENT_INDEX; i++) {
2073 ret = e_snprintf(buf, len, "%s_%d", base, i); 2081 ret = e_snprintf(buf, len, "%s_%d", base, i);
2074 if (ret < 0) { 2082 if (ret < 0) {
2075 pr_debug("snprintf() failed: %s\n", strerror(-ret)); 2083 pr_debug("snprintf() failed: %d\n", ret);
2076 return ret; 2084 return ret;
2077 } 2085 }
2078 if (!strlist__has_entry(namelist, buf)) 2086 if (!strlist__has_entry(namelist, buf))
@@ -2437,7 +2445,8 @@ static int __del_trace_probe_event(int fd, struct str_node *ent)
2437 printf("Removed event: %s\n", ent->s); 2445 printf("Removed event: %s\n", ent->s);
2438 return 0; 2446 return 0;
2439error: 2447error:
2440 pr_warning("Failed to delete event: %s\n", strerror(-ret)); 2448 pr_warning("Failed to delete event: %s\n",
2449 strerror_r(-ret, buf, sizeof(buf)));
2441 return ret; 2450 return ret;
2442} 2451}
2443 2452
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index dca9145d704c..9c593561aa71 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -281,6 +281,7 @@ static int convert_variable_type(Dwarf_Die *vr_die,
281 struct probe_trace_arg_ref **ref_ptr = &tvar->ref; 281 struct probe_trace_arg_ref **ref_ptr = &tvar->ref;
282 Dwarf_Die type; 282 Dwarf_Die type;
283 char buf[16]; 283 char buf[16];
284 char sbuf[STRERR_BUFSIZE];
284 int bsize, boffs, total; 285 int bsize, boffs, total;
285 int ret; 286 int ret;
286 287
@@ -367,7 +368,7 @@ formatted:
367 if (ret >= 16) 368 if (ret >= 16)
368 ret = -E2BIG; 369 ret = -E2BIG;
369 pr_warning("Failed to convert variable type: %s\n", 370 pr_warning("Failed to convert variable type: %s\n",
370 strerror(-ret)); 371 strerror_r(-ret, sbuf, sizeof(sbuf)));
371 return ret; 372 return ret;
372 } 373 }
373 tvar->type = strdup(buf); 374 tvar->type = strdup(buf);
@@ -779,10 +780,12 @@ static int find_lazy_match_lines(struct intlist *list,
779 size_t line_len; 780 size_t line_len;
780 ssize_t len; 781 ssize_t len;
781 int count = 0, linenum = 1; 782 int count = 0, linenum = 1;
783 char sbuf[STRERR_BUFSIZE];
782 784
783 fp = fopen(fname, "r"); 785 fp = fopen(fname, "r");
784 if (!fp) { 786 if (!fp) {
785 pr_warning("Failed to open %s: %s\n", fname, strerror(errno)); 787 pr_warning("Failed to open %s: %s\n", fname,
788 strerror_r(errno, sbuf, sizeof(sbuf)));
786 return -errno; 789 return -errno;
787 } 790 }
788 791
diff --git a/tools/perf/util/run-command.c b/tools/perf/util/run-command.c
index da8e9b285f51..34622b53e733 100644
--- a/tools/perf/util/run-command.c
+++ b/tools/perf/util/run-command.c
@@ -1,6 +1,7 @@
1#include "cache.h" 1#include "cache.h"
2#include "run-command.h" 2#include "run-command.h"
3#include "exec_cmd.h" 3#include "exec_cmd.h"
4#include "debug.h"
4 5
5static inline void close_pair(int fd[2]) 6static inline void close_pair(int fd[2])
6{ 7{
@@ -19,6 +20,7 @@ int start_command(struct child_process *cmd)
19{ 20{
20 int need_in, need_out, need_err; 21 int need_in, need_out, need_err;
21 int fdin[2], fdout[2], fderr[2]; 22 int fdin[2], fdout[2], fderr[2];
23 char sbuf[STRERR_BUFSIZE];
22 24
23 /* 25 /*
24 * In case of errors we must keep the promise to close FDs 26 * In case of errors we must keep the promise to close FDs
@@ -99,7 +101,7 @@ int start_command(struct child_process *cmd)
99 101
100 if (cmd->dir && chdir(cmd->dir)) 102 if (cmd->dir && chdir(cmd->dir))
101 die("exec %s: cd to %s failed (%s)", cmd->argv[0], 103 die("exec %s: cd to %s failed (%s)", cmd->argv[0],
102 cmd->dir, strerror(errno)); 104 cmd->dir, strerror_r(errno, sbuf, sizeof(sbuf)));
103 if (cmd->env) { 105 if (cmd->env) {
104 for (; *cmd->env; cmd->env++) { 106 for (; *cmd->env; cmd->env++) {
105 if (strchr(*cmd->env, '=')) 107 if (strchr(*cmd->env, '='))
@@ -153,6 +155,8 @@ int start_command(struct child_process *cmd)
153 155
154static int wait_or_whine(pid_t pid) 156static int wait_or_whine(pid_t pid)
155{ 157{
158 char sbuf[STRERR_BUFSIZE];
159
156 for (;;) { 160 for (;;) {
157 int status, code; 161 int status, code;
158 pid_t waiting = waitpid(pid, &status, 0); 162 pid_t waiting = waitpid(pid, &status, 0);
@@ -160,7 +164,8 @@ static int wait_or_whine(pid_t pid)
160 if (waiting < 0) { 164 if (waiting < 0) {
161 if (errno == EINTR) 165 if (errno == EINTR)
162 continue; 166 continue;
163 error("waitpid failed (%s)", strerror(errno)); 167 error("waitpid failed (%s)",
168 strerror_r(errno, sbuf, sizeof(sbuf)));
164 return -ERR_RUN_COMMAND_WAITPID; 169 return -ERR_RUN_COMMAND_WAITPID;
165 } 170 }
166 if (waiting != pid) 171 if (waiting != pid)
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 25822bdf7bbf..24e8d871b74e 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -456,6 +456,7 @@ int filename__read_str(const char *filename, char **buf, size_t *sizep)
456 size_t size = 0, alloc_size = 0; 456 size_t size = 0, alloc_size = 0;
457 void *bf = NULL, *nbf; 457 void *bf = NULL, *nbf;
458 int fd, n, err = 0; 458 int fd, n, err = 0;
459 char sbuf[STRERR_BUFSIZE];
459 460
460 fd = open(filename, O_RDONLY); 461 fd = open(filename, O_RDONLY);
461 if (fd < 0) 462 if (fd < 0)
@@ -476,8 +477,8 @@ int filename__read_str(const char *filename, char **buf, size_t *sizep)
476 n = read(fd, bf + size, alloc_size - size); 477 n = read(fd, bf + size, alloc_size - size);
477 if (n < 0) { 478 if (n < 0) {
478 if (size) { 479 if (size) {
479 pr_warning("read failed %d: %s\n", 480 pr_warning("read failed %d: %s\n", errno,
480 errno, strerror(errno)); 481 strerror_r(errno, sbuf, sizeof(sbuf)));
481 err = 0; 482 err = 0;
482 } else 483 } else
483 err = -errno; 484 err = -errno;