Commit 6e81c74c authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Arnaldo Carvalho de Melo

perf util: Replace strerror with strerror_r for thread-safety

Replaces all strerror with strerror_r in util for making the perf lib
thread-safe.
Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Naohiro Aota <naota@elisp.net>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/20140814022236.3545.3367.stgit@kbuild-fedora.novalocalSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5f03cba4
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "../perf.h" #include "../perf.h"
#include "cloexec.h" #include "cloexec.h"
#include "asm/bug.h" #include "asm/bug.h"
#include "debug.h"
static unsigned long flag = PERF_FLAG_FD_CLOEXEC; static unsigned long flag = PERF_FLAG_FD_CLOEXEC;
...@@ -18,6 +19,7 @@ static int perf_flag_probe(void) ...@@ -18,6 +19,7 @@ static int perf_flag_probe(void)
int err; int err;
int cpu; int cpu;
pid_t pid = -1; pid_t pid = -1;
char sbuf[STRERR_BUFSIZE];
cpu = sched_getcpu(); cpu = sched_getcpu();
if (cpu < 0) if (cpu < 0)
...@@ -42,7 +44,7 @@ static int perf_flag_probe(void) ...@@ -42,7 +44,7 @@ static int perf_flag_probe(void)
WARN_ONCE(err != EINVAL && err != EBUSY, WARN_ONCE(err != EINVAL && err != EBUSY,
"perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error %d (%s)\n", "perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error %d (%s)\n",
err, strerror(err)); err, strerror_r(err, sbuf, sizeof(sbuf)));
/* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */ /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */
fd = sys_perf_event_open(&attr, pid, cpu, -1, 0); fd = sys_perf_event_open(&attr, pid, cpu, -1, 0);
...@@ -50,7 +52,7 @@ static int perf_flag_probe(void) ...@@ -50,7 +52,7 @@ static int perf_flag_probe(void)
if (WARN_ONCE(fd < 0 && err != EBUSY, if (WARN_ONCE(fd < 0 && err != EBUSY,
"perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n", "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n",
err, strerror(err))) err, strerror_r(err, sbuf, sizeof(sbuf))))
return -1; return -1;
close(fd); close(fd);
......
...@@ -50,12 +50,14 @@ static int open_file_read(struct perf_data_file *file) ...@@ -50,12 +50,14 @@ static int open_file_read(struct perf_data_file *file)
{ {
struct stat st; struct stat st;
int fd; int fd;
char sbuf[STRERR_BUFSIZE];
fd = open(file->path, O_RDONLY); fd = open(file->path, O_RDONLY);
if (fd < 0) { if (fd < 0) {
int err = errno; int err = errno;
pr_err("failed to open %s: %s", file->path, strerror(err)); pr_err("failed to open %s: %s", file->path,
strerror_r(err, sbuf, sizeof(sbuf)));
if (err == ENOENT && !strcmp(file->path, "perf.data")) if (err == ENOENT && !strcmp(file->path, "perf.data"))
pr_err(" (try 'perf record' first)"); pr_err(" (try 'perf record' first)");
pr_err("\n"); pr_err("\n");
...@@ -88,6 +90,7 @@ static int open_file_read(struct perf_data_file *file) ...@@ -88,6 +90,7 @@ static int open_file_read(struct perf_data_file *file)
static int open_file_write(struct perf_data_file *file) static int open_file_write(struct perf_data_file *file)
{ {
int fd; int fd;
char sbuf[STRERR_BUFSIZE];
if (check_backup(file)) if (check_backup(file))
return -1; return -1;
...@@ -95,7 +98,8 @@ static int open_file_write(struct perf_data_file *file) ...@@ -95,7 +98,8 @@ static int open_file_write(struct perf_data_file *file)
fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR); fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
if (fd < 0) if (fd < 0)
pr_err("failed to open %s : %s\n", file->path, strerror(errno)); pr_err("failed to open %s : %s\n", file->path,
strerror_r(errno, sbuf, sizeof(sbuf)));
return fd; return fd;
} }
......
...@@ -162,13 +162,15 @@ static void close_first_dso(void); ...@@ -162,13 +162,15 @@ static void close_first_dso(void);
static int do_open(char *name) static int do_open(char *name)
{ {
int fd; int fd;
char sbuf[STRERR_BUFSIZE];
do { do {
fd = open(name, O_RDONLY); fd = open(name, O_RDONLY);
if (fd >= 0) if (fd >= 0)
return fd; return fd;
pr_debug("dso open failed, mmap: %s\n", strerror(errno)); pr_debug("dso open failed, mmap: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
if (!dso__data_open_cnt || errno != EMFILE) if (!dso__data_open_cnt || errno != EMFILE)
break; break;
...@@ -530,10 +532,12 @@ static ssize_t cached_read(struct dso *dso, u64 offset, u8 *data, ssize_t size) ...@@ -530,10 +532,12 @@ static ssize_t cached_read(struct dso *dso, u64 offset, u8 *data, ssize_t size)
static int data_file_size(struct dso *dso) static int data_file_size(struct dso *dso)
{ {
struct stat st; struct stat st;
char sbuf[STRERR_BUFSIZE];
if (!dso->data.file_size) { if (!dso->data.file_size) {
if (fstat(dso->data.fd, &st)) { if (fstat(dso->data.fd, &st)) {
pr_err("dso mmap failed, fstat: %s\n", strerror(errno)); pr_err("dso mmap failed, fstat: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
return -1; return -1;
} }
dso->data.file_size = st.st_size; dso->data.file_size = st.st_size;
......
...@@ -1295,7 +1295,7 @@ int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused, ...@@ -1295,7 +1295,7 @@ int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused,
int err, char *buf, size_t size) int err, char *buf, size_t size)
{ {
int printed, value; int printed, value;
char sbuf[128], *emsg = strerror_r(err, sbuf, sizeof(sbuf)); char sbuf[STRERR_BUFSIZE], *emsg = strerror_r(err, sbuf, sizeof(sbuf));
switch (err) { switch (err) {
case EACCES: case EACCES:
......
...@@ -2027,6 +2027,8 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err, ...@@ -2027,6 +2027,8 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
int err, char *msg, size_t size) int err, char *msg, size_t size)
{ {
char sbuf[STRERR_BUFSIZE];
switch (err) { switch (err) {
case EPERM: case EPERM:
case EACCES: case EACCES:
...@@ -2072,8 +2074,9 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, ...@@ -2072,8 +2074,9 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
} }
return scnprintf(msg, size, return scnprintf(msg, size,
"The sys_perf_event_open() syscall returned with %d (%s) for event (%s). \n" "The sys_perf_event_open() syscall returned with %d (%s) for event (%s).\n"
"/bin/dmesg may provide additional information.\n" "/bin/dmesg may provide additional information.\n"
"No CONFIG_PERF_EVENTS=y kernel support configured?\n", "No CONFIG_PERF_EVENTS=y kernel support configured?\n",
err, strerror(err), perf_evsel__name(evsel)); err, strerror_r(err, sbuf, sizeof(sbuf)),
perf_evsel__name(evsel));
} }
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "symbol.h" #include "symbol.h"
#include "cache.h" #include "cache.h"
#include "header.h" #include "header.h"
#include "debug.h"
#include <api/fs/debugfs.h> #include <api/fs/debugfs.h>
#include "parse-events-bison.h" #include "parse-events-bison.h"
#define YY_EXTRA_TYPE int #define YY_EXTRA_TYPE int
...@@ -1006,9 +1007,11 @@ void print_tracepoint_events(const char *subsys_glob, const char *event_glob, ...@@ -1006,9 +1007,11 @@ void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
char evt_path[MAXPATHLEN]; char evt_path[MAXPATHLEN];
char dir_path[MAXPATHLEN]; char dir_path[MAXPATHLEN];
char sbuf[STRERR_BUFSIZE];
if (debugfs_valid_mountpoint(tracing_events_path)) { if (debugfs_valid_mountpoint(tracing_events_path)) {
printf(" [ Tracepoints not available: %s ]\n", strerror(errno)); printf(" [ Tracepoints not available: %s ]\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
return; return;
} }
......
#include "cache.h" #include "cache.h"
#include "run-command.h" #include "run-command.h"
#include "exec_cmd.h" #include "exec_cmd.h"
#include "debug.h"
static inline void close_pair(int fd[2]) static inline void close_pair(int fd[2])
{ {
...@@ -19,6 +20,7 @@ int start_command(struct child_process *cmd) ...@@ -19,6 +20,7 @@ int start_command(struct child_process *cmd)
{ {
int need_in, need_out, need_err; int need_in, need_out, need_err;
int fdin[2], fdout[2], fderr[2]; int fdin[2], fdout[2], fderr[2];
char sbuf[STRERR_BUFSIZE];
/* /*
* In case of errors we must keep the promise to close FDs * In case of errors we must keep the promise to close FDs
...@@ -99,7 +101,7 @@ int start_command(struct child_process *cmd) ...@@ -99,7 +101,7 @@ int start_command(struct child_process *cmd)
if (cmd->dir && chdir(cmd->dir)) if (cmd->dir && chdir(cmd->dir))
die("exec %s: cd to %s failed (%s)", cmd->argv[0], die("exec %s: cd to %s failed (%s)", cmd->argv[0],
cmd->dir, strerror(errno)); cmd->dir, strerror_r(errno, sbuf, sizeof(sbuf)));
if (cmd->env) { if (cmd->env) {
for (; *cmd->env; cmd->env++) { for (; *cmd->env; cmd->env++) {
if (strchr(*cmd->env, '=')) if (strchr(*cmd->env, '='))
...@@ -153,6 +155,8 @@ int start_command(struct child_process *cmd) ...@@ -153,6 +155,8 @@ int start_command(struct child_process *cmd)
static int wait_or_whine(pid_t pid) static int wait_or_whine(pid_t pid)
{ {
char sbuf[STRERR_BUFSIZE];
for (;;) { for (;;) {
int status, code; int status, code;
pid_t waiting = waitpid(pid, &status, 0); pid_t waiting = waitpid(pid, &status, 0);
...@@ -160,7 +164,8 @@ static int wait_or_whine(pid_t pid) ...@@ -160,7 +164,8 @@ static int wait_or_whine(pid_t pid)
if (waiting < 0) { if (waiting < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
error("waitpid failed (%s)", strerror(errno)); error("waitpid failed (%s)",
strerror_r(errno, sbuf, sizeof(sbuf)));
return -ERR_RUN_COMMAND_WAITPID; return -ERR_RUN_COMMAND_WAITPID;
} }
if (waiting != pid) if (waiting != pid)
......
...@@ -456,6 +456,7 @@ int filename__read_str(const char *filename, char **buf, size_t *sizep) ...@@ -456,6 +456,7 @@ int filename__read_str(const char *filename, char **buf, size_t *sizep)
size_t size = 0, alloc_size = 0; size_t size = 0, alloc_size = 0;
void *bf = NULL, *nbf; void *bf = NULL, *nbf;
int fd, n, err = 0; int fd, n, err = 0;
char sbuf[STRERR_BUFSIZE];
fd = open(filename, O_RDONLY); fd = open(filename, O_RDONLY);
if (fd < 0) if (fd < 0)
...@@ -476,8 +477,8 @@ int filename__read_str(const char *filename, char **buf, size_t *sizep) ...@@ -476,8 +477,8 @@ int filename__read_str(const char *filename, char **buf, size_t *sizep)
n = read(fd, bf + size, alloc_size - size); n = read(fd, bf + size, alloc_size - size);
if (n < 0) { if (n < 0) {
if (size) { if (size) {
pr_warning("read failed %d: %s\n", pr_warning("read failed %d: %s\n", errno,
errno, strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
err = 0; err = 0;
} else } else
err = -errno; err = -errno;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment