aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/include/linux/string.h2
-rw-r--r--tools/lib/str_error_r.c26
-rw-r--r--tools/perf/MANIFEST1
-rw-r--r--tools/perf/arch/x86/tests/rdpmc.c4
-rw-r--r--tools/perf/builtin-buildid-cache.c8
-rw-r--r--tools/perf/builtin-help.c8
-rw-r--r--tools/perf/builtin-kvm.c4
-rw-r--r--tools/perf/builtin-probe.c2
-rw-r--r--tools/perf/builtin-record.c6
-rw-r--r--tools/perf/builtin-sched.c2
-rw-r--r--tools/perf/builtin-stat.c4
-rw-r--r--tools/perf/builtin-top.c6
-rw-r--r--tools/perf/builtin-trace.c4
-rw-r--r--tools/perf/perf.c6
-rw-r--r--tools/perf/tests/backward-ring-buffer.c4
-rw-r--r--tools/perf/tests/bpf.c4
-rw-r--r--tools/perf/tests/builtin-test.c2
-rw-r--r--tools/perf/tests/event-times.c2
-rw-r--r--tools/perf/tests/mmap-basic.c6
-rw-r--r--tools/perf/tests/openat-syscall-all-cpus.c4
-rw-r--r--tools/perf/tests/openat-syscall-tp-fields.c4
-rw-r--r--tools/perf/tests/openat-syscall.c2
-rw-r--r--tools/perf/tests/perf-record.c8
-rw-r--r--tools/perf/tests/sw-clock.c4
-rw-r--r--tools/perf/tests/task-exit.c4
-rw-r--r--tools/perf/ui/browsers/hists.c2
-rw-r--r--tools/perf/util/Build5
-rw-r--r--tools/perf/util/bpf-loader.c2
-rw-r--r--tools/perf/util/cloexec.c4
-rw-r--r--tools/perf/util/data.c4
-rw-r--r--tools/perf/util/debug.h2
-rw-r--r--tools/perf/util/dso.c6
-rw-r--r--tools/perf/util/evlist.c4
-rw-r--r--tools/perf/util/evsel.c2
-rw-r--r--tools/perf/util/llvm-utils.c8
-rw-r--r--tools/perf/util/probe-event.c6
-rw-r--r--tools/perf/util/probe-file.c10
-rw-r--r--tools/perf/util/probe-finder.c4
-rw-r--r--tools/perf/util/python-ext-sources1
-rw-r--r--tools/perf/util/target.c2
-rw-r--r--tools/perf/util/util.h1
41 files changed, 113 insertions, 77 deletions
diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h
index e26223f1f287..b466d0228b57 100644
--- a/tools/include/linux/string.h
+++ b/tools/include/linux/string.h
@@ -12,4 +12,6 @@ int strtobool(const char *s, bool *res);
12extern size_t strlcpy(char *dest, const char *src, size_t size); 12extern size_t strlcpy(char *dest, const char *src, size_t size);
13#endif 13#endif
14 14
15char *str_error_r(int errnum, char *buf, size_t buflen);
16
15#endif /* _LINUX_STRING_H_ */ 17#endif /* _LINUX_STRING_H_ */
diff --git a/tools/lib/str_error_r.c b/tools/lib/str_error_r.c
new file mode 100644
index 000000000000..503ae072244c
--- /dev/null
+++ b/tools/lib/str_error_r.c
@@ -0,0 +1,26 @@
1#undef _GNU_SOURCE
2#include <string.h>
3#include <stdio.h>
4#include <linux/string.h>
5
6/*
7 * The tools so far have been using the strerror_r() GNU variant, that returns
8 * a string, be it the buffer passed or something else.
9 *
10 * But that, besides being tricky in cases where we expect that the function
11 * using strerror_r() returns the error formatted in a provided buffer (we have
12 * to check if it returned something else and copy that instead), breaks the
13 * build on systems not using glibc, like Alpine Linux, where musl libc is
14 * used.
15 *
16 * So, introduce yet another wrapper, str_error_r(), that has the GNU
17 * interface, but uses the portable XSI variant of strerror_r(), so that users
18 * rest asured that the provided buffer is used and it is what is returned.
19 */
20char *str_error_r(int errnum, char *buf, size_t buflen)
21{
22 int err = strerror_r(errnum, buf, buflen);
23 if (err)
24 snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err);
25 return buf;
26}
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST
index 8c8c6b9ce915..f18e781447bc 100644
--- a/tools/perf/MANIFEST
+++ b/tools/perf/MANIFEST
@@ -29,6 +29,7 @@ tools/lib/symbol/kallsyms.c
29tools/lib/symbol/kallsyms.h 29tools/lib/symbol/kallsyms.h
30tools/lib/find_bit.c 30tools/lib/find_bit.c
31tools/lib/bitmap.c 31tools/lib/bitmap.c
32tools/lib/str_error_r.c
32tools/include/asm/atomic.h 33tools/include/asm/atomic.h
33tools/include/asm/barrier.h 34tools/include/asm/barrier.h
34tools/include/asm/bug.h 35tools/include/asm/bug.h
diff --git a/tools/perf/arch/x86/tests/rdpmc.c b/tools/perf/arch/x86/tests/rdpmc.c
index 72193f19d6d7..a32d72e91ffa 100644
--- a/tools/perf/arch/x86/tests/rdpmc.c
+++ b/tools/perf/arch/x86/tests/rdpmc.c
@@ -111,14 +111,14 @@ static int __test__rdpmc(void)
111 if (fd < 0) { 111 if (fd < 0) {
112 pr_err("Error: sys_perf_event_open() syscall returned " 112 pr_err("Error: sys_perf_event_open() syscall returned "
113 "with %d (%s)\n", fd, 113 "with %d (%s)\n", fd,
114 strerror_r(errno, sbuf, sizeof(sbuf))); 114 str_error_r(errno, sbuf, sizeof(sbuf)));
115 return -1; 115 return -1;
116 } 116 }
117 117
118 addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0); 118 addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0);
119 if (addr == (void *)(-1)) { 119 if (addr == (void *)(-1)) {
120 pr_err("Error: mmap() syscall returned with (%s)\n", 120 pr_err("Error: mmap() syscall returned with (%s)\n",
121 strerror_r(errno, sbuf, sizeof(sbuf))); 121 str_error_r(errno, sbuf, sizeof(sbuf)));
122 goto out_close; 122 goto out_close;
123 } 123 }
124 124
diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildid-cache.c
index 76a4d03c7cd0..30e2b2cb2421 100644
--- a/tools/perf/builtin-buildid-cache.c
+++ b/tools/perf/builtin-buildid-cache.c
@@ -351,7 +351,7 @@ int cmd_buildid_cache(int argc, const char **argv,
351 continue; 351 continue;
352 } 352 }
353 pr_warning("Couldn't add %s: %s\n", 353 pr_warning("Couldn't add %s: %s\n",
354 pos->s, strerror_r(errno, sbuf, sizeof(sbuf))); 354 pos->s, str_error_r(errno, sbuf, sizeof(sbuf)));
355 } 355 }
356 356
357 strlist__delete(list); 357 strlist__delete(list);
@@ -369,7 +369,7 @@ int cmd_buildid_cache(int argc, const char **argv,
369 continue; 369 continue;
370 } 370 }
371 pr_warning("Couldn't remove %s: %s\n", 371 pr_warning("Couldn't remove %s: %s\n",
372 pos->s, strerror_r(errno, sbuf, sizeof(sbuf))); 372 pos->s, str_error_r(errno, sbuf, sizeof(sbuf)));
373 } 373 }
374 374
375 strlist__delete(list); 375 strlist__delete(list);
@@ -387,7 +387,7 @@ int cmd_buildid_cache(int argc, const char **argv,
387 continue; 387 continue;
388 } 388 }
389 pr_warning("Couldn't remove %s: %s\n", 389 pr_warning("Couldn't remove %s: %s\n",
390 pos->s, strerror_r(errno, sbuf, sizeof(sbuf))); 390 pos->s, str_error_r(errno, sbuf, sizeof(sbuf)));
391 } 391 }
392 392
393 strlist__delete(list); 393 strlist__delete(list);
@@ -408,7 +408,7 @@ int cmd_buildid_cache(int argc, const char **argv,
408 continue; 408 continue;
409 } 409 }
410 pr_warning("Couldn't update %s: %s\n", 410 pr_warning("Couldn't update %s: %s\n",
411 pos->s, strerror_r(errno, sbuf, sizeof(sbuf))); 411 pos->s, str_error_r(errno, sbuf, sizeof(sbuf)));
412 } 412 }
413 413
414 strlist__delete(list); 414 strlist__delete(list);
diff --git a/tools/perf/builtin-help.c b/tools/perf/builtin-help.c
index 268ab732b8aa..3bdb2c78a21b 100644
--- a/tools/perf/builtin-help.c
+++ b/tools/perf/builtin-help.c
@@ -117,7 +117,7 @@ static void exec_woman_emacs(const char *path, const char *page)
117 free(man_page); 117 free(man_page);
118 } 118 }
119 warning("failed to exec '%s': %s", path, 119 warning("failed to exec '%s': %s", path,
120 strerror_r(errno, sbuf, sizeof(sbuf))); 120 str_error_r(errno, sbuf, sizeof(sbuf)));
121 } 121 }
122} 122}
123 123
@@ -150,7 +150,7 @@ static void exec_man_konqueror(const char *path, const char *page)
150 free(man_page); 150 free(man_page);
151 } 151 }
152 warning("failed to exec '%s': %s", path, 152 warning("failed to exec '%s': %s", path,
153 strerror_r(errno, sbuf, sizeof(sbuf))); 153 str_error_r(errno, sbuf, sizeof(sbuf)));
154 } 154 }
155} 155}
156 156
@@ -162,7 +162,7 @@ static void exec_man_man(const char *path, const char *page)
162 path = "man"; 162 path = "man";
163 execlp(path, "man", page, NULL); 163 execlp(path, "man", page, NULL);
164 warning("failed to exec '%s': %s", path, 164 warning("failed to exec '%s': %s", path,
165 strerror_r(errno, sbuf, sizeof(sbuf))); 165 str_error_r(errno, sbuf, sizeof(sbuf)));
166} 166}
167 167
168static void exec_man_cmd(const char *cmd, const char *page) 168static void exec_man_cmd(const char *cmd, const char *page)
@@ -175,7 +175,7 @@ static void exec_man_cmd(const char *cmd, const char *page)
175 free(shell_cmd); 175 free(shell_cmd);
176 } 176 }
177 warning("failed to exec '%s': %s", cmd, 177 warning("failed to exec '%s': %s", cmd,
178 strerror_r(errno, sbuf, sizeof(sbuf))); 178 str_error_r(errno, sbuf, sizeof(sbuf)));
179} 179}
180 180
181static void add_man_viewer(const char *name) 181static void add_man_viewer(const char *name)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index f4efef9d1eb3..5e2127e04f83 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -1018,13 +1018,13 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
1018 err = perf_evlist__open(evlist); 1018 err = perf_evlist__open(evlist);
1019 if (err < 0) { 1019 if (err < 0) {
1020 printf("Couldn't create the events: %s\n", 1020 printf("Couldn't create the events: %s\n",
1021 strerror_r(errno, sbuf, sizeof(sbuf))); 1021 str_error_r(errno, sbuf, sizeof(sbuf)));
1022 goto out; 1022 goto out;
1023 } 1023 }
1024 1024
1025 if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) { 1025 if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) {
1026 ui__error("Failed to mmap the events: %s\n", 1026 ui__error("Failed to mmap the events: %s\n",
1027 strerror_r(errno, sbuf, sizeof(sbuf))); 1027 str_error_r(errno, sbuf, sizeof(sbuf)));
1028 perf_evlist__close(evlist); 1028 perf_evlist__close(evlist);
1029 goto out; 1029 goto out;
1030 } 1030 }
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index a1a5cd1b8d60..c6d890ad2c1a 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -308,7 +308,7 @@ static void pr_err_with_code(const char *msg, int err)
308 308
309 pr_err("%s", msg); 309 pr_err("%s", msg);
310 pr_debug(" Reason: %s (Code: %d)", 310 pr_debug(" Reason: %s (Code: %d)",
311 strerror_r(-err, sbuf, sizeof(sbuf)), err); 311 str_error_r(-err, sbuf, sizeof(sbuf)), err);
312 pr_err("\n"); 312 pr_err("\n");
313} 313}
314 314
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index b2b3b600adf5..d9f5cc3a3667 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -361,7 +361,7 @@ static int record__mmap_evlist(struct record *rec,
361 return -errno; 361 return -errno;
362 } else { 362 } else {
363 pr_err("failed to mmap with %d (%s)\n", errno, 363 pr_err("failed to mmap with %d (%s)\n", errno,
364 strerror_r(errno, msg, sizeof(msg))); 364 str_error_r(errno, msg, sizeof(msg)));
365 if (errno) 365 if (errno)
366 return -errno; 366 return -errno;
367 else 367 else
@@ -407,7 +407,7 @@ try_again:
407 if (perf_evlist__apply_filters(evlist, &pos)) { 407 if (perf_evlist__apply_filters(evlist, &pos)) {
408 error("failed to set filter \"%s\" on event %s with %d (%s)\n", 408 error("failed to set filter \"%s\" on event %s with %d (%s)\n",
409 pos->filter, perf_evsel__name(pos), errno, 409 pos->filter, perf_evsel__name(pos), errno,
410 strerror_r(errno, msg, sizeof(msg))); 410 str_error_r(errno, msg, sizeof(msg)));
411 rc = -1; 411 rc = -1;
412 goto out; 412 goto out;
413 } 413 }
@@ -1003,7 +1003,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
1003 1003
1004 if (forks && workload_exec_errno) { 1004 if (forks && workload_exec_errno) {
1005 char msg[STRERR_BUFSIZE]; 1005 char msg[STRERR_BUFSIZE];
1006 const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg)); 1006 const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg));
1007 pr_err("Workload failed: %s\n", emsg); 1007 pr_err("Workload failed: %s\n", emsg);
1008 err = -1; 1008 err = -1;
1009 goto out_child; 1009 goto out_child;
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index afa057666c2a..0dfe8df2ab9b 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -494,7 +494,7 @@ force_again:
494 } 494 }
495 pr_err("Error: sys_perf_event_open() syscall returned " 495 pr_err("Error: sys_perf_event_open() syscall returned "
496 "with %d (%s)\n%s", fd, 496 "with %d (%s)\n%s", fd,
497 strerror_r(errno, sbuf, sizeof(sbuf)), info); 497 str_error_r(errno, sbuf, sizeof(sbuf)), info);
498 exit(EXIT_FAILURE); 498 exit(EXIT_FAILURE);
499 } 499 }
500 return fd; 500 return fd;
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index c367a43525e6..8c5a3bfdfdd7 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -596,7 +596,7 @@ try_again:
596 if (perf_evlist__apply_filters(evsel_list, &counter)) { 596 if (perf_evlist__apply_filters(evsel_list, &counter)) {
597 error("failed to set filter \"%s\" on event %s with %d (%s)\n", 597 error("failed to set filter \"%s\" on event %s with %d (%s)\n",
598 counter->filter, perf_evsel__name(counter), errno, 598 counter->filter, perf_evsel__name(counter), errno,
599 strerror_r(errno, msg, sizeof(msg))); 599 str_error_r(errno, msg, sizeof(msg)));
600 return -1; 600 return -1;
601 } 601 }
602 602
@@ -637,7 +637,7 @@ try_again:
637 wait(&status); 637 wait(&status);
638 638
639 if (workload_exec_errno) { 639 if (workload_exec_errno) {
640 const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg)); 640 const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg));
641 pr_err("Workload failed: %s\n", emsg); 641 pr_err("Workload failed: %s\n", emsg);
642 return -1; 642 return -1;
643 } 643 }
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 07fc7921980c..bd108683fcb8 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -907,7 +907,7 @@ try_again:
907 907
908 if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) { 908 if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) {
909 ui__error("Failed to mmap with %d (%s)\n", 909 ui__error("Failed to mmap with %d (%s)\n",
910 errno, strerror_r(errno, msg, sizeof(msg))); 910 errno, str_error_r(errno, msg, sizeof(msg)));
911 goto out_err; 911 goto out_err;
912 } 912 }
913 913
@@ -1028,7 +1028,7 @@ out_delete:
1028 1028
1029out_err_cpu_topo: { 1029out_err_cpu_topo: {
1030 char errbuf[BUFSIZ]; 1030 char errbuf[BUFSIZ];
1031 const char *err = strerror_r(-ret, errbuf, sizeof(errbuf)); 1031 const char *err = str_error_r(-ret, errbuf, sizeof(errbuf));
1032 1032
1033 ui__error("Could not read the CPU topology map: %s\n", err); 1033 ui__error("Could not read the CPU topology map: %s\n", err);
1034 goto out_delete; 1034 goto out_delete;
@@ -1295,7 +1295,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
1295 1295
1296 if (perf_evlist__create_maps(top.evlist, target) < 0) { 1296 if (perf_evlist__create_maps(top.evlist, target) < 0) {
1297 ui__error("Couldn't create thread/CPU maps: %s\n", 1297 ui__error("Couldn't create thread/CPU maps: %s\n",
1298 errno == ENOENT ? "No such process" : strerror_r(errno, errbuf, sizeof(errbuf))); 1298 errno == ENOENT ? "No such process" : str_error_r(errno, errbuf, sizeof(errbuf)));
1299 goto out_delete_evlist; 1299 goto out_delete_evlist;
1300 } 1300 }
1301 1301
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index cf90de811523..e7e0b6e306b7 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1601,7 +1601,7 @@ signed_print:
1601 fprintf(trace->output, ") = %ld", ret); 1601 fprintf(trace->output, ") = %ld", ret);
1602 } else if (ret < 0 && (sc->fmt->errmsg || sc->fmt->errpid)) { 1602 } else if (ret < 0 && (sc->fmt->errmsg || sc->fmt->errpid)) {
1603 char bf[STRERR_BUFSIZE]; 1603 char bf[STRERR_BUFSIZE];
1604 const char *emsg = strerror_r(-ret, bf, sizeof(bf)), 1604 const char *emsg = str_error_r(-ret, bf, sizeof(bf)),
1605 *e = audit_errno_to_name(-ret); 1605 *e = audit_errno_to_name(-ret);
1606 1606
1607 fprintf(trace->output, ") = -1 %s %s", e, emsg); 1607 fprintf(trace->output, ") = -1 %s %s", e, emsg);
@@ -2402,7 +2402,7 @@ out_error_apply_filters:
2402 fprintf(trace->output, 2402 fprintf(trace->output,
2403 "Failed to set filter \"%s\" on event %s with %d (%s)\n", 2403 "Failed to set filter \"%s\" on event %s with %d (%s)\n",
2404 evsel->filter, perf_evsel__name(evsel), errno, 2404 evsel->filter, perf_evsel__name(evsel), errno,
2405 strerror_r(errno, errbuf, sizeof(errbuf))); 2405 str_error_r(errno, errbuf, sizeof(errbuf)));
2406 goto out_delete_evlist; 2406 goto out_delete_evlist;
2407} 2407}
2408out_error_mem: 2408out_error_mem:
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 8f219223f305..f7d7dbbd2af6 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -374,7 +374,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
374 /* Check for ENOSPC and EIO errors.. */ 374 /* Check for ENOSPC and EIO errors.. */
375 if (fflush(stdout)) { 375 if (fflush(stdout)) {
376 fprintf(stderr, "write failure on standard output: %s", 376 fprintf(stderr, "write failure on standard output: %s",
377 strerror_r(errno, sbuf, sizeof(sbuf))); 377 str_error_r(errno, sbuf, sizeof(sbuf)));
378 goto out; 378 goto out;
379 } 379 }
380 if (ferror(stdout)) { 380 if (ferror(stdout)) {
@@ -383,7 +383,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
383 } 383 }
384 if (fclose(stdout)) { 384 if (fclose(stdout)) {
385 fprintf(stderr, "close failed on standard output: %s", 385 fprintf(stderr, "close failed on standard output: %s",
386 strerror_r(errno, sbuf, sizeof(sbuf))); 386 str_error_r(errno, sbuf, sizeof(sbuf)));
387 goto out; 387 goto out;
388 } 388 }
389 status = 0; 389 status = 0;
@@ -615,7 +615,7 @@ int main(int argc, const char **argv)
615 } 615 }
616 616
617 fprintf(stderr, "Failed to run command '%s': %s\n", 617 fprintf(stderr, "Failed to run command '%s': %s\n",
618 cmd, strerror_r(errno, sbuf, sizeof(sbuf))); 618 cmd, str_error_r(errno, sbuf, sizeof(sbuf)));
619out: 619out:
620 return 1; 620 return 1;
621} 621}
diff --git a/tools/perf/tests/backward-ring-buffer.c b/tools/perf/tests/backward-ring-buffer.c
index e70313fac5a5..f20ea4c0d0cb 100644
--- a/tools/perf/tests/backward-ring-buffer.c
+++ b/tools/perf/tests/backward-ring-buffer.c
@@ -60,7 +60,7 @@ static int do_test(struct perf_evlist *evlist, int mmap_pages,
60 err = perf_evlist__mmap(evlist, mmap_pages, true); 60 err = perf_evlist__mmap(evlist, mmap_pages, true);
61 if (err < 0) { 61 if (err < 0) {
62 pr_debug("perf_evlist__mmap: %s\n", 62 pr_debug("perf_evlist__mmap: %s\n",
63 strerror_r(errno, sbuf, sizeof(sbuf))); 63 str_error_r(errno, sbuf, sizeof(sbuf)));
64 return TEST_FAIL; 64 return TEST_FAIL;
65 } 65 }
66 66
@@ -124,7 +124,7 @@ int test__backward_ring_buffer(int subtest __maybe_unused)
124 err = perf_evlist__open(evlist); 124 err = perf_evlist__open(evlist);
125 if (err < 0) { 125 if (err < 0) {
126 pr_debug("perf_evlist__open: %s\n", 126 pr_debug("perf_evlist__open: %s\n",
127 strerror_r(errno, sbuf, sizeof(sbuf))); 127 str_error_r(errno, sbuf, sizeof(sbuf)));
128 goto out_delete_evlist; 128 goto out_delete_evlist;
129 } 129 }
130 130
diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
index f31eed31c1a9..da0d87613975 100644
--- a/tools/perf/tests/bpf.c
+++ b/tools/perf/tests/bpf.c
@@ -143,14 +143,14 @@ static int do_test(struct bpf_object *obj, int (*func)(void),
143 err = perf_evlist__open(evlist); 143 err = perf_evlist__open(evlist);
144 if (err < 0) { 144 if (err < 0) {
145 pr_debug("perf_evlist__open: %s\n", 145 pr_debug("perf_evlist__open: %s\n",
146 strerror_r(errno, sbuf, sizeof(sbuf))); 146 str_error_r(errno, sbuf, sizeof(sbuf)));
147 goto out_delete_evlist; 147 goto out_delete_evlist;
148 } 148 }
149 149
150 err = perf_evlist__mmap(evlist, opts.mmap_pages, false); 150 err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
151 if (err < 0) { 151 if (err < 0) {
152 pr_debug("perf_evlist__mmap: %s\n", 152 pr_debug("perf_evlist__mmap: %s\n",
153 strerror_r(errno, sbuf, sizeof(sbuf))); 153 str_error_r(errno, sbuf, sizeof(sbuf)));
154 goto out_delete_evlist; 154 goto out_delete_evlist;
155 } 155 }
156 156
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 07c14e9f6546..c23cbf733549 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -258,7 +258,7 @@ static int run_test(struct test *test, int subtest)
258 258
259 if (child < 0) { 259 if (child < 0) {
260 pr_err("failed to fork test: %s\n", 260 pr_err("failed to fork test: %s\n",
261 strerror_r(errno, sbuf, sizeof(sbuf))); 261 str_error_r(errno, sbuf, sizeof(sbuf)));
262 return -1; 262 return -1;
263 } 263 }
264 264
diff --git a/tools/perf/tests/event-times.c b/tools/perf/tests/event-times.c
index 9f5698ac81ae..19ef77bd6eb4 100644
--- a/tools/perf/tests/event-times.c
+++ b/tools/perf/tests/event-times.c
@@ -37,7 +37,7 @@ static int attach__enable_on_exec(struct perf_evlist *evlist)
37 err = perf_evlist__open(evlist); 37 err = perf_evlist__open(evlist);
38 if (err < 0) { 38 if (err < 0) {
39 pr_debug("perf_evlist__open: %s\n", 39 pr_debug("perf_evlist__open: %s\n",
40 strerror_r(errno, sbuf, sizeof(sbuf))); 40 str_error_r(errno, sbuf, sizeof(sbuf)));
41 return err; 41 return err;
42 } 42 }
43 43
diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c
index aea33f5589c5..5c9b931b7b66 100644
--- a/tools/perf/tests/mmap-basic.c
+++ b/tools/perf/tests/mmap-basic.c
@@ -49,7 +49,7 @@ int test__basic_mmap(int subtest __maybe_unused)
49 sched_setaffinity(0, sizeof(cpu_set), &cpu_set); 49 sched_setaffinity(0, sizeof(cpu_set), &cpu_set);
50 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) { 50 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
51 pr_debug("sched_setaffinity() failed on CPU %d: %s ", 51 pr_debug("sched_setaffinity() failed on CPU %d: %s ",
52 cpus->map[0], strerror_r(errno, sbuf, sizeof(sbuf))); 52 cpus->map[0], str_error_r(errno, sbuf, sizeof(sbuf)));
53 goto out_free_cpus; 53 goto out_free_cpus;
54 } 54 }
55 55
@@ -79,7 +79,7 @@ int test__basic_mmap(int subtest __maybe_unused)
79 if (perf_evsel__open(evsels[i], cpus, threads) < 0) { 79 if (perf_evsel__open(evsels[i], cpus, threads) < 0) {
80 pr_debug("failed to open counter: %s, " 80 pr_debug("failed to open counter: %s, "
81 "tweak /proc/sys/kernel/perf_event_paranoid?\n", 81 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
82 strerror_r(errno, sbuf, sizeof(sbuf))); 82 str_error_r(errno, sbuf, sizeof(sbuf)));
83 goto out_delete_evlist; 83 goto out_delete_evlist;
84 } 84 }
85 85
@@ -89,7 +89,7 @@ int test__basic_mmap(int subtest __maybe_unused)
89 89
90 if (perf_evlist__mmap(evlist, 128, true) < 0) { 90 if (perf_evlist__mmap(evlist, 128, true) < 0) {
91 pr_debug("failed to mmap events: %d (%s)\n", errno, 91 pr_debug("failed to mmap events: %d (%s)\n", errno,
92 strerror_r(errno, sbuf, sizeof(sbuf))); 92 str_error_r(errno, sbuf, sizeof(sbuf)));
93 goto out_delete_evlist; 93 goto out_delete_evlist;
94 } 94 }
95 95
diff --git a/tools/perf/tests/openat-syscall-all-cpus.c b/tools/perf/tests/openat-syscall-all-cpus.c
index ad1cb63139a7..265abb12dfff 100644
--- a/tools/perf/tests/openat-syscall-all-cpus.c
+++ b/tools/perf/tests/openat-syscall-all-cpus.c
@@ -41,7 +41,7 @@ int test__openat_syscall_event_on_all_cpus(int subtest __maybe_unused)
41 if (perf_evsel__open(evsel, cpus, threads) < 0) { 41 if (perf_evsel__open(evsel, cpus, threads) < 0) {
42 pr_debug("failed to open counter: %s, " 42 pr_debug("failed to open counter: %s, "
43 "tweak /proc/sys/kernel/perf_event_paranoid?\n", 43 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
44 strerror_r(errno, sbuf, sizeof(sbuf))); 44 str_error_r(errno, sbuf, sizeof(sbuf)));
45 goto out_evsel_delete; 45 goto out_evsel_delete;
46 } 46 }
47 47
@@ -62,7 +62,7 @@ int test__openat_syscall_event_on_all_cpus(int subtest __maybe_unused)
62 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) { 62 if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
63 pr_debug("sched_setaffinity() failed on CPU %d: %s ", 63 pr_debug("sched_setaffinity() failed on CPU %d: %s ",
64 cpus->map[cpu], 64 cpus->map[cpu],
65 strerror_r(errno, sbuf, sizeof(sbuf))); 65 str_error_r(errno, sbuf, sizeof(sbuf)));
66 goto out_close_fd; 66 goto out_close_fd;
67 } 67 }
68 for (i = 0; i < ncalls; ++i) { 68 for (i = 0; i < ncalls; ++i) {
diff --git a/tools/perf/tests/openat-syscall-tp-fields.c b/tools/perf/tests/openat-syscall-tp-fields.c
index 4344fe482c1d..942dbf43d7c7 100644
--- a/tools/perf/tests/openat-syscall-tp-fields.c
+++ b/tools/perf/tests/openat-syscall-tp-fields.c
@@ -51,14 +51,14 @@ int test__syscall_openat_tp_fields(int subtest __maybe_unused)
51 err = perf_evlist__open(evlist); 51 err = perf_evlist__open(evlist);
52 if (err < 0) { 52 if (err < 0) {
53 pr_debug("perf_evlist__open: %s\n", 53 pr_debug("perf_evlist__open: %s\n",
54 strerror_r(errno, sbuf, sizeof(sbuf))); 54 str_error_r(errno, sbuf, sizeof(sbuf)));
55 goto out_delete_evlist; 55 goto out_delete_evlist;
56 } 56 }
57 57
58 err = perf_evlist__mmap(evlist, UINT_MAX, false); 58 err = perf_evlist__mmap(evlist, UINT_MAX, false);
59 if (err < 0) { 59 if (err < 0) {
60 pr_debug("perf_evlist__mmap: %s\n", 60 pr_debug("perf_evlist__mmap: %s\n",
61 strerror_r(errno, sbuf, sizeof(sbuf))); 61 str_error_r(errno, sbuf, sizeof(sbuf)));
62 goto out_delete_evlist; 62 goto out_delete_evlist;
63 } 63 }
64 64
diff --git a/tools/perf/tests/openat-syscall.c b/tools/perf/tests/openat-syscall.c
index 1184f9ba6499..d7414128d7fe 100644
--- a/tools/perf/tests/openat-syscall.c
+++ b/tools/perf/tests/openat-syscall.c
@@ -29,7 +29,7 @@ int test__openat_syscall_event(int subtest __maybe_unused)
29 if (perf_evsel__open_per_thread(evsel, threads) < 0) { 29 if (perf_evsel__open_per_thread(evsel, threads) < 0) {
30 pr_debug("failed to open counter: %s, " 30 pr_debug("failed to open counter: %s, "
31 "tweak /proc/sys/kernel/perf_event_paranoid?\n", 31 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
32 strerror_r(errno, sbuf, sizeof(sbuf))); 32 str_error_r(errno, sbuf, sizeof(sbuf)));
33 goto out_evsel_delete; 33 goto out_evsel_delete;
34 } 34 }
35 35
diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c
index b836ee6a8d9b..3eb67a977b6a 100644
--- a/tools/perf/tests/perf-record.c
+++ b/tools/perf/tests/perf-record.c
@@ -104,7 +104,7 @@ int test__PERF_RECORD(int subtest __maybe_unused)
104 err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); 104 err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
105 if (err < 0) { 105 if (err < 0) {
106 pr_debug("sched__get_first_possible_cpu: %s\n", 106 pr_debug("sched__get_first_possible_cpu: %s\n",
107 strerror_r(errno, sbuf, sizeof(sbuf))); 107 str_error_r(errno, sbuf, sizeof(sbuf)));
108 goto out_delete_evlist; 108 goto out_delete_evlist;
109 } 109 }
110 110
@@ -115,7 +115,7 @@ int test__PERF_RECORD(int subtest __maybe_unused)
115 */ 115 */
116 if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { 116 if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) {
117 pr_debug("sched_setaffinity: %s\n", 117 pr_debug("sched_setaffinity: %s\n",
118 strerror_r(errno, sbuf, sizeof(sbuf))); 118 str_error_r(errno, sbuf, sizeof(sbuf)));
119 goto out_delete_evlist; 119 goto out_delete_evlist;
120 } 120 }
121 121
@@ -126,7 +126,7 @@ int test__PERF_RECORD(int subtest __maybe_unused)
126 err = perf_evlist__open(evlist); 126 err = perf_evlist__open(evlist);
127 if (err < 0) { 127 if (err < 0) {
128 pr_debug("perf_evlist__open: %s\n", 128 pr_debug("perf_evlist__open: %s\n",
129 strerror_r(errno, sbuf, sizeof(sbuf))); 129 str_error_r(errno, sbuf, sizeof(sbuf)));
130 goto out_delete_evlist; 130 goto out_delete_evlist;
131 } 131 }
132 132
@@ -138,7 +138,7 @@ int test__PERF_RECORD(int subtest __maybe_unused)
138 err = perf_evlist__mmap(evlist, opts.mmap_pages, false); 138 err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
139 if (err < 0) { 139 if (err < 0) {
140 pr_debug("perf_evlist__mmap: %s\n", 140 pr_debug("perf_evlist__mmap: %s\n",
141 strerror_r(errno, sbuf, sizeof(sbuf))); 141 str_error_r(errno, sbuf, sizeof(sbuf)));
142 goto out_delete_evlist; 142 goto out_delete_evlist;
143 } 143 }
144 144
diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c
index 36e8ce1550e3..4c9fd046d57b 100644
--- a/tools/perf/tests/sw-clock.c
+++ b/tools/perf/tests/sw-clock.c
@@ -70,7 +70,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
70 70
71 err = -errno; 71 err = -errno;
72 pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n", 72 pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n",
73 strerror_r(errno, sbuf, sizeof(sbuf)), 73 str_error_r(errno, sbuf, sizeof(sbuf)),
74 knob, (u64)attr.sample_freq); 74 knob, (u64)attr.sample_freq);
75 goto out_delete_evlist; 75 goto out_delete_evlist;
76 } 76 }
@@ -78,7 +78,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
78 err = perf_evlist__mmap(evlist, 128, true); 78 err = perf_evlist__mmap(evlist, 128, true);
79 if (err < 0) { 79 if (err < 0) {
80 pr_debug("failed to mmap event: %d (%s)\n", errno, 80 pr_debug("failed to mmap event: %d (%s)\n", errno,
81 strerror_r(errno, sbuf, sizeof(sbuf))); 81 str_error_r(errno, sbuf, sizeof(sbuf)));
82 goto out_delete_evlist; 82 goto out_delete_evlist;
83 } 83 }
84 84
diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c
index 2dfff7ac8ef3..01a5ba2788c6 100644
--- a/tools/perf/tests/task-exit.c
+++ b/tools/perf/tests/task-exit.c
@@ -91,13 +91,13 @@ int test__task_exit(int subtest __maybe_unused)
91 err = perf_evlist__open(evlist); 91 err = perf_evlist__open(evlist);
92 if (err < 0) { 92 if (err < 0) {
93 pr_debug("Couldn't open the evlist: %s\n", 93 pr_debug("Couldn't open the evlist: %s\n",
94 strerror_r(-err, sbuf, sizeof(sbuf))); 94 str_error_r(-err, sbuf, sizeof(sbuf)));
95 goto out_delete_evlist; 95 goto out_delete_evlist;
96 } 96 }
97 97
98 if (perf_evlist__mmap(evlist, 128, true) < 0) { 98 if (perf_evlist__mmap(evlist, 128, true) < 0) {
99 pr_debug("failed to mmap events: %d (%s)\n", errno, 99 pr_debug("failed to mmap events: %d (%s)\n", errno,
100 strerror_r(errno, sbuf, sizeof(sbuf))); 100 str_error_r(errno, sbuf, sizeof(sbuf)));
101 goto out_delete_evlist; 101 goto out_delete_evlist;
102 } 102 }
103 103
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index e08b8f7b6d3f..13d414384739 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -2029,7 +2029,7 @@ static int hist_browser__dump(struct hist_browser *browser)
2029 fp = fopen(filename, "w"); 2029 fp = fopen(filename, "w");
2030 if (fp == NULL) { 2030 if (fp == NULL) {
2031 char bf[64]; 2031 char bf[64];
2032 const char *err = strerror_r(errno, bf, sizeof(bf)); 2032 const char *err = str_error_r(errno, bf, sizeof(bf));
2033 ui_helpline__fpush("Couldn't write to %s: %s", filename, err); 2033 ui_helpline__fpush("Couldn't write to %s: %s", filename, err);
2034 return -1; 2034 return -1;
2035 } 2035 }
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index fced8336e5fd..a6a805302312 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -70,6 +70,7 @@ libperf-y += stat.o
70libperf-y += stat-shadow.o 70libperf-y += stat-shadow.o
71libperf-y += record.o 71libperf-y += record.o
72libperf-y += srcline.o 72libperf-y += srcline.o
73libperf-y += str_error_r.o
73libperf-y += data.o 74libperf-y += data.o
74libperf-y += tsc.o 75libperf-y += tsc.o
75libperf-y += cloexec.o 76libperf-y += cloexec.o
@@ -173,6 +174,10 @@ $(OUTPUT)util/libstring.o: ../lib/string.c FORCE
173 $(call rule_mkdir) 174 $(call rule_mkdir)
174 $(call if_changed_dep,cc_o_c) 175 $(call if_changed_dep,cc_o_c)
175 176
177$(OUTPUT)util/str_error_r.o: ../lib/str_error_r.c FORCE
178 $(call rule_mkdir)
179 $(call if_changed_dep,cc_o_c)
180
176$(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE 181$(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE
177 $(call rule_mkdir) 182 $(call rule_mkdir)
178 $(call if_changed_dep,cc_o_c) 183 $(call if_changed_dep,cc_o_c)
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index dcc8845881ae..8445e89621fe 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -1589,7 +1589,7 @@ bpf_loader_strerror(int err, char *buf, size_t size)
1589 snprintf(buf, size, "Unknown bpf loader error %d", err); 1589 snprintf(buf, size, "Unknown bpf loader error %d", err);
1590 else 1590 else
1591 snprintf(buf, size, "%s", 1591 snprintf(buf, size, "%s",
1592 strerror_r(err, sbuf, sizeof(sbuf))); 1592 str_error_r(err, sbuf, sizeof(sbuf)));
1593 1593
1594 buf[size - 1] = '\0'; 1594 buf[size - 1] = '\0';
1595 return -1; 1595 return -1;
diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c
index 2babddaa2481..fde772db1d5c 100644
--- a/tools/perf/util/cloexec.c
+++ b/tools/perf/util/cloexec.c
@@ -58,7 +58,7 @@ static int perf_flag_probe(void)
58 58
59 WARN_ONCE(err != EINVAL && err != EBUSY, 59 WARN_ONCE(err != EINVAL && err != EBUSY,
60 "perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error %d (%s)\n", 60 "perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error %d (%s)\n",
61 err, strerror_r(err, sbuf, sizeof(sbuf))); 61 err, str_error_r(err, sbuf, sizeof(sbuf)));
62 62
63 /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */ 63 /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */
64 while (1) { 64 while (1) {
@@ -76,7 +76,7 @@ static int perf_flag_probe(void)
76 76
77 if (WARN_ONCE(fd < 0 && err != EBUSY, 77 if (WARN_ONCE(fd < 0 && err != EBUSY,
78 "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n", 78 "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n",
79 err, strerror_r(err, sbuf, sizeof(sbuf)))) 79 err, str_error_r(err, sbuf, sizeof(sbuf))))
80 return -1; 80 return -1;
81 81
82 return 0; 82 return 0;
diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c
index be83516155ee..60bfc9ca1e22 100644
--- a/tools/perf/util/data.c
+++ b/tools/perf/util/data.c
@@ -57,7 +57,7 @@ static int open_file_read(struct perf_data_file *file)
57 int err = errno; 57 int err = errno;
58 58
59 pr_err("failed to open %s: %s", file->path, 59 pr_err("failed to open %s: %s", file->path,
60 strerror_r(err, sbuf, sizeof(sbuf))); 60 str_error_r(err, sbuf, sizeof(sbuf)));
61 if (err == ENOENT && !strcmp(file->path, "perf.data")) 61 if (err == ENOENT && !strcmp(file->path, "perf.data"))
62 pr_err(" (try 'perf record' first)"); 62 pr_err(" (try 'perf record' first)");
63 pr_err("\n"); 63 pr_err("\n");
@@ -99,7 +99,7 @@ static int open_file_write(struct perf_data_file *file)
99 99
100 if (fd < 0) 100 if (fd < 0)
101 pr_err("failed to open %s : %s\n", file->path, 101 pr_err("failed to open %s : %s\n", file->path,
102 strerror_r(errno, sbuf, sizeof(sbuf))); 102 str_error_r(errno, sbuf, sizeof(sbuf)));
103 103
104 return fd; 104 return fd;
105} 105}
diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
index 14bafda79eda..d242adc3d5a2 100644
--- a/tools/perf/util/debug.h
+++ b/tools/perf/util/debug.h
@@ -38,7 +38,7 @@ extern int debug_data_convert;
38#define pr_oe_time(t, fmt, ...) pr_time_N(1, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__) 38#define pr_oe_time(t, fmt, ...) pr_time_N(1, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__)
39#define pr_oe_time2(t, fmt, ...) pr_time_N(2, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__) 39#define pr_oe_time2(t, fmt, ...) pr_time_N(2, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__)
40 40
41#define STRERR_BUFSIZE 128 /* For the buffer size of strerror_r */ 41#define STRERR_BUFSIZE 128 /* For the buffer size of str_error_r */
42 42
43int dump_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); 43int dump_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
44void trace_event(union perf_event *event); 44void trace_event(union perf_event *event);
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index e1de6cc4863e..774f6ec884d5 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -335,7 +335,7 @@ static int do_open(char *name)
335 return fd; 335 return fd;
336 336
337 pr_debug("dso open failed: %s\n", 337 pr_debug("dso open failed: %s\n",
338 strerror_r(errno, sbuf, sizeof(sbuf))); 338 str_error_r(errno, sbuf, sizeof(sbuf)));
339 if (!dso__data_open_cnt || errno != EMFILE) 339 if (!dso__data_open_cnt || errno != EMFILE)
340 break; 340 break;
341 341
@@ -786,7 +786,7 @@ static int data_file_size(struct dso *dso, struct machine *machine)
786 if (fstat(dso->data.fd, &st) < 0) { 786 if (fstat(dso->data.fd, &st) < 0) {
787 ret = -errno; 787 ret = -errno;
788 pr_err("dso cache fstat failed: %s\n", 788 pr_err("dso cache fstat failed: %s\n",
789 strerror_r(errno, sbuf, sizeof(sbuf))); 789 str_error_r(errno, sbuf, sizeof(sbuf)));
790 dso->data.status = DSO_DATA_STATUS_ERROR; 790 dso->data.status = DSO_DATA_STATUS_ERROR;
791 goto out; 791 goto out;
792 } 792 }
@@ -1366,7 +1366,7 @@ int dso__strerror_load(struct dso *dso, char *buf, size_t buflen)
1366 BUG_ON(buflen == 0); 1366 BUG_ON(buflen == 0);
1367 1367
1368 if (errnum >= 0) { 1368 if (errnum >= 0) {
1369 const char *err = strerror_r(errnum, buf, buflen); 1369 const char *err = str_error_r(errnum, buf, buflen);
1370 1370
1371 if (err != buf) 1371 if (err != buf)
1372 scnprintf(buf, buflen, "%s", err); 1372 scnprintf(buf, buflen, "%s", err);
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 113507716044..f2d478df8c3e 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -1790,7 +1790,7 @@ int perf_evlist__strerror_open(struct perf_evlist *evlist,
1790 int err, char *buf, size_t size) 1790 int err, char *buf, size_t size)
1791{ 1791{
1792 int printed, value; 1792 int printed, value;
1793 char sbuf[STRERR_BUFSIZE], *emsg = strerror_r(err, sbuf, sizeof(sbuf)); 1793 char sbuf[STRERR_BUFSIZE], *emsg = str_error_r(err, sbuf, sizeof(sbuf));
1794 1794
1795 switch (err) { 1795 switch (err) {
1796 case EACCES: 1796 case EACCES:
@@ -1842,7 +1842,7 @@ out_default:
1842 1842
1843int perf_evlist__strerror_mmap(struct perf_evlist *evlist, int err, char *buf, size_t size) 1843int perf_evlist__strerror_mmap(struct perf_evlist *evlist, int err, char *buf, size_t size)
1844{ 1844{
1845 char sbuf[STRERR_BUFSIZE], *emsg = strerror_r(err, sbuf, sizeof(sbuf)); 1845 char sbuf[STRERR_BUFSIZE], *emsg = str_error_r(err, sbuf, sizeof(sbuf));
1846 int pages_attempted = evlist->mmap_len / 1024, pages_max_per_user, printed = 0; 1846 int pages_attempted = evlist->mmap_len / 1024, pages_max_per_user, printed = 0;
1847 1847
1848 switch (err) { 1848 switch (err) {
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 0fea724e735c..d8c2298cd32a 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2419,7 +2419,7 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
2419 "The sys_perf_event_open() syscall returned with %d (%s) for event (%s).\n" 2419 "The sys_perf_event_open() syscall returned with %d (%s) for event (%s).\n"
2420 "/bin/dmesg may provide additional information.\n" 2420 "/bin/dmesg may provide additional information.\n"
2421 "No CONFIG_PERF_EVENTS=y kernel support configured?", 2421 "No CONFIG_PERF_EVENTS=y kernel support configured?",
2422 err, strerror_r(err, sbuf, sizeof(sbuf)), 2422 err, str_error_r(err, sbuf, sizeof(sbuf)),
2423 perf_evsel__name(evsel)); 2423 perf_evsel__name(evsel));
2424} 2424}
2425 2425
diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c
index 40b6f7269cb4..282c30f6a51d 100644
--- a/tools/perf/util/llvm-utils.c
+++ b/tools/perf/util/llvm-utils.c
@@ -106,7 +106,7 @@ read_from_pipe(const char *cmd, void **p_buf, size_t *p_read_sz)
106 file = popen(cmd, "r"); 106 file = popen(cmd, "r");
107 if (!file) { 107 if (!file) {
108 pr_err("ERROR: unable to popen cmd: %s\n", 108 pr_err("ERROR: unable to popen cmd: %s\n",
109 strerror_r(errno, serr, sizeof(serr))); 109 str_error_r(errno, serr, sizeof(serr)));
110 return -EINVAL; 110 return -EINVAL;
111 } 111 }
112 112
@@ -140,7 +140,7 @@ read_from_pipe(const char *cmd, void **p_buf, size_t *p_read_sz)
140 140
141 if (ferror(file)) { 141 if (ferror(file)) {
142 pr_err("ERROR: error occurred when reading from pipe: %s\n", 142 pr_err("ERROR: error occurred when reading from pipe: %s\n",
143 strerror_r(errno, serr, sizeof(serr))); 143 str_error_r(errno, serr, sizeof(serr)));
144 err = -EIO; 144 err = -EIO;
145 goto errout; 145 goto errout;
146 } 146 }
@@ -382,7 +382,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
382 if (path[0] != '-' && realpath(path, abspath) == NULL) { 382 if (path[0] != '-' && realpath(path, abspath) == NULL) {
383 err = errno; 383 err = errno;
384 pr_err("ERROR: problems with path %s: %s\n", 384 pr_err("ERROR: problems with path %s: %s\n",
385 path, strerror_r(err, serr, sizeof(serr))); 385 path, str_error_r(err, serr, sizeof(serr)));
386 return -err; 386 return -err;
387 } 387 }
388 388
@@ -410,7 +410,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
410 if (nr_cpus_avail <= 0) { 410 if (nr_cpus_avail <= 0) {
411 pr_err( 411 pr_err(
412"WARNING:\tunable to get available CPUs in this system: %s\n" 412"WARNING:\tunable to get available CPUs in this system: %s\n"
413" \tUse 128 instead.\n", strerror_r(errno, serr, sizeof(serr))); 413" \tUse 128 instead.\n", str_error_r(errno, serr, sizeof(serr)));
414 nr_cpus_avail = 128; 414 nr_cpus_avail = 128;
415 } 415 }
416 snprintf(nr_cpus_avail_str, sizeof(nr_cpus_avail_str), "%d", 416 snprintf(nr_cpus_avail_str, sizeof(nr_cpus_avail_str), "%d",
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 0201f661ccb8..2b222a7955c9 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -468,7 +468,7 @@ static struct debuginfo *open_debuginfo(const char *module, bool silent)
468 err = kernel_get_module_dso(module, &dso); 468 err = kernel_get_module_dso(module, &dso);
469 if (err < 0) { 469 if (err < 0) {
470 if (!dso || dso->load_errno == 0) { 470 if (!dso || dso->load_errno == 0) {
471 if (!strerror_r(-err, reason, STRERR_BUFSIZE)) 471 if (!str_error_r(-err, reason, STRERR_BUFSIZE))
472 strcpy(reason, "(unknown)"); 472 strcpy(reason, "(unknown)");
473 } else 473 } else
474 dso__strerror_load(dso, reason, STRERR_BUFSIZE); 474 dso__strerror_load(dso, reason, STRERR_BUFSIZE);
@@ -806,7 +806,7 @@ static int __show_one_line(FILE *fp, int l, bool skip, bool show_num)
806error: 806error:
807 if (ferror(fp)) { 807 if (ferror(fp)) {
808 pr_warning("File read error: %s\n", 808 pr_warning("File read error: %s\n",
809 strerror_r(errno, sbuf, sizeof(sbuf))); 809 str_error_r(errno, sbuf, sizeof(sbuf)));
810 return -1; 810 return -1;
811 } 811 }
812 return 0; 812 return 0;
@@ -886,7 +886,7 @@ static int __show_line_range(struct line_range *lr, const char *module,
886 fp = fopen(lr->path, "r"); 886 fp = fopen(lr->path, "r");
887 if (fp == NULL) { 887 if (fp == NULL) {
888 pr_warning("Failed to open %s: %s\n", lr->path, 888 pr_warning("Failed to open %s: %s\n", lr->path,
889 strerror_r(errno, sbuf, sizeof(sbuf))); 889 str_error_r(errno, sbuf, sizeof(sbuf)));
890 return -errno; 890 return -errno;
891 } 891 }
892 /* Skip to starting line number */ 892 /* Skip to starting line number */
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index 5b563b2e8b1d..98398b55a03f 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -50,7 +50,7 @@ static void print_open_warning(int err, bool uprobe)
50 else 50 else
51 pr_warning("Failed to open %cprobe_events: %s\n", 51 pr_warning("Failed to open %cprobe_events: %s\n",
52 uprobe ? 'u' : 'k', 52 uprobe ? 'u' : 'k',
53 strerror_r(-err, sbuf, sizeof(sbuf))); 53 str_error_r(-err, sbuf, sizeof(sbuf)));
54} 54}
55 55
56static void print_both_open_warning(int kerr, int uerr) 56static void print_both_open_warning(int kerr, int uerr)
@@ -64,9 +64,9 @@ static void print_both_open_warning(int kerr, int uerr)
64 else { 64 else {
65 char sbuf[STRERR_BUFSIZE]; 65 char sbuf[STRERR_BUFSIZE];
66 pr_warning("Failed to open kprobe events: %s.\n", 66 pr_warning("Failed to open kprobe events: %s.\n",
67 strerror_r(-kerr, sbuf, sizeof(sbuf))); 67 str_error_r(-kerr, sbuf, sizeof(sbuf)));
68 pr_warning("Failed to open uprobe events: %s.\n", 68 pr_warning("Failed to open uprobe events: %s.\n",
69 strerror_r(-uerr, sbuf, sizeof(sbuf))); 69 str_error_r(-uerr, sbuf, sizeof(sbuf)));
70 } 70 }
71} 71}
72 72
@@ -224,7 +224,7 @@ int probe_file__add_event(int fd, struct probe_trace_event *tev)
224 if (write(fd, buf, strlen(buf)) < (int)strlen(buf)) { 224 if (write(fd, buf, strlen(buf)) < (int)strlen(buf)) {
225 ret = -errno; 225 ret = -errno;
226 pr_warning("Failed to write event: %s\n", 226 pr_warning("Failed to write event: %s\n",
227 strerror_r(errno, sbuf, sizeof(sbuf))); 227 str_error_r(errno, sbuf, sizeof(sbuf)));
228 } 228 }
229 } 229 }
230 free(buf); 230 free(buf);
@@ -262,7 +262,7 @@ static int __del_trace_probe_event(int fd, struct str_node *ent)
262 return 0; 262 return 0;
263error: 263error:
264 pr_warning("Failed to delete event: %s\n", 264 pr_warning("Failed to delete event: %s\n",
265 strerror_r(-ret, buf, sizeof(buf))); 265 str_error_r(-ret, buf, sizeof(buf)));
266 return ret; 266 return ret;
267} 267}
268 268
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 1259839dbf6d..f2d9ff064e2d 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -381,7 +381,7 @@ formatted:
381 if (ret >= 16) 381 if (ret >= 16)
382 ret = -E2BIG; 382 ret = -E2BIG;
383 pr_warning("Failed to convert variable type: %s\n", 383 pr_warning("Failed to convert variable type: %s\n",
384 strerror_r(-ret, sbuf, sizeof(sbuf))); 384 str_error_r(-ret, sbuf, sizeof(sbuf)));
385 return ret; 385 return ret;
386 } 386 }
387 tvar->type = strdup(buf); 387 tvar->type = strdup(buf);
@@ -809,7 +809,7 @@ static int find_lazy_match_lines(struct intlist *list,
809 fp = fopen(fname, "r"); 809 fp = fopen(fname, "r");
810 if (!fp) { 810 if (!fp) {
811 pr_warning("Failed to open %s: %s\n", fname, 811 pr_warning("Failed to open %s: %s\n", fname,
812 strerror_r(errno, sbuf, sizeof(sbuf))); 812 str_error_r(errno, sbuf, sizeof(sbuf)));
813 return -errno; 813 return -errno;
814 } 814 }
815 815
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
index 36c6862119e3..49210b7a7925 100644
--- a/tools/perf/util/python-ext-sources
+++ b/tools/perf/util/python-ext-sources
@@ -13,6 +13,7 @@ util/cpumap.c
13../lib/bitmap.c 13../lib/bitmap.c
14../lib/find_bit.c 14../lib/find_bit.c
15../lib/hweight.c 15../lib/hweight.c
16../lib/str_error_r.c
16util/thread_map.c 17util/thread_map.c
17util/util.c 18util/util.c
18util/xyarray.c 19util/xyarray.c
diff --git a/tools/perf/util/target.c b/tools/perf/util/target.c
index a53603b27e52..5898af4510cc 100644
--- a/tools/perf/util/target.c
+++ b/tools/perf/util/target.c
@@ -121,7 +121,7 @@ int target__strerror(struct target *target, int errnum,
121 BUG_ON(buflen == 0); 121 BUG_ON(buflen == 0);
122 122
123 if (errnum >= 0) { 123 if (errnum >= 0) {
124 const char *err = strerror_r(errnum, buf, buflen); 124 const char *err = str_error_r(errnum, buf, buflen);
125 125
126 if (err != buf) 126 if (err != buf)
127 scnprintf(buf, buflen, "%s", err); 127 scnprintf(buf, buflen, "%s", err);
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 1e8c3167b9fb..2370cfb902b2 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -360,4 +360,5 @@ typedef void (*print_binary_t)(enum binary_printer_ops,
360void print_binary(unsigned char *data, size_t len, 360void print_binary(unsigned char *data, size_t len,
361 size_t bytes_per_line, print_binary_t printer, 361 size_t bytes_per_line, print_binary_t printer,
362 void *extra); 362 void *extra);
363
363#endif /* GIT_COMPAT_UTIL_H */ 364#endif /* GIT_COMPAT_UTIL_H */