提交 af924aa3 编写于 作者: I Ingo Molnar

Merge tag 'perf-core-for-mingo' of...

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: NArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: NIngo Molnar <mingo@kernel.org>
...@@ -12,6 +12,11 @@ const char *const arm_triplets[] = { ...@@ -12,6 +12,11 @@ const char *const arm_triplets[] = {
NULL NULL
}; };
const char *const arm64_triplets[] = {
"aarch64-linux-android-",
NULL
};
const char *const powerpc_triplets[] = { const char *const powerpc_triplets[] = {
"powerpc-unknown-linux-gnu-", "powerpc-unknown-linux-gnu-",
"powerpc64-unknown-linux-gnu-", "powerpc64-unknown-linux-gnu-",
...@@ -105,6 +110,8 @@ static const char *normalize_arch(char *arch) ...@@ -105,6 +110,8 @@ static const char *normalize_arch(char *arch)
return "x86"; return "x86";
if (!strcmp(arch, "sun4u") || !strncmp(arch, "sparc", 5)) if (!strcmp(arch, "sun4u") || !strncmp(arch, "sparc", 5))
return "sparc"; return "sparc";
if (!strcmp(arch, "aarch64") || !strcmp(arch, "arm64"))
return "arm64";
if (!strncmp(arch, "arm", 3) || !strcmp(arch, "sa110")) if (!strncmp(arch, "arm", 3) || !strcmp(arch, "sa110"))
return "arm"; return "arm";
if (!strncmp(arch, "s390", 4)) if (!strncmp(arch, "s390", 4))
...@@ -159,6 +166,8 @@ static int perf_session_env__lookup_binutils_path(struct perf_session_env *env, ...@@ -159,6 +166,8 @@ static int perf_session_env__lookup_binutils_path(struct perf_session_env *env,
if (!strcmp(arch, "arm")) if (!strcmp(arch, "arm"))
path_list = arm_triplets; path_list = arm_triplets;
else if (!strcmp(arch, "arm64"))
path_list = arm64_triplets;
else if (!strcmp(arch, "powerpc")) else if (!strcmp(arch, "powerpc"))
path_list = powerpc_triplets; path_list = powerpc_triplets;
else if (!strcmp(arch, "sh")) else if (!strcmp(arch, "sh"))
......
...@@ -291,6 +291,7 @@ int cmd_buildid_cache(int argc, const char **argv, ...@@ -291,6 +291,7 @@ int cmd_buildid_cache(int argc, const char **argv,
*missing_filename = NULL, *missing_filename = NULL,
*update_name_list_str = NULL, *update_name_list_str = NULL,
*kcore_filename; *kcore_filename;
char sbuf[STRERR_BUFSIZE];
struct perf_data_file file = { struct perf_data_file file = {
.mode = PERF_DATA_MODE_READ, .mode = PERF_DATA_MODE_READ,
...@@ -347,7 +348,7 @@ int cmd_buildid_cache(int argc, const char **argv, ...@@ -347,7 +348,7 @@ int cmd_buildid_cache(int argc, const char **argv,
continue; continue;
} }
pr_warning("Couldn't add %s: %s\n", pr_warning("Couldn't add %s: %s\n",
pos->s, strerror(errno)); pos->s, strerror_r(errno, sbuf, sizeof(sbuf)));
} }
strlist__delete(list); strlist__delete(list);
...@@ -365,7 +366,7 @@ int cmd_buildid_cache(int argc, const char **argv, ...@@ -365,7 +366,7 @@ int cmd_buildid_cache(int argc, const char **argv,
continue; continue;
} }
pr_warning("Couldn't remove %s: %s\n", pr_warning("Couldn't remove %s: %s\n",
pos->s, strerror(errno)); pos->s, strerror_r(errno, sbuf, sizeof(sbuf)));
} }
strlist__delete(list); strlist__delete(list);
...@@ -386,7 +387,7 @@ int cmd_buildid_cache(int argc, const char **argv, ...@@ -386,7 +387,7 @@ int cmd_buildid_cache(int argc, const char **argv,
continue; continue;
} }
pr_warning("Couldn't update %s: %s\n", pr_warning("Couldn't update %s: %s\n",
pos->s, strerror(errno)); pos->s, strerror_r(errno, sbuf, sizeof(sbuf)));
} }
strlist__delete(list); strlist__delete(list);
......
...@@ -103,6 +103,8 @@ static int check_emacsclient_version(void) ...@@ -103,6 +103,8 @@ static int check_emacsclient_version(void)
static void exec_woman_emacs(const char *path, const char *page) static void exec_woman_emacs(const char *path, const char *page)
{ {
char sbuf[STRERR_BUFSIZE];
if (!check_emacsclient_version()) { if (!check_emacsclient_version()) {
/* This works only with emacsclient version >= 22. */ /* This works only with emacsclient version >= 22. */
struct strbuf man_page = STRBUF_INIT; struct strbuf man_page = STRBUF_INIT;
...@@ -111,16 +113,19 @@ static void exec_woman_emacs(const char *path, const char *page) ...@@ -111,16 +113,19 @@ static void exec_woman_emacs(const char *path, const char *page)
path = "emacsclient"; path = "emacsclient";
strbuf_addf(&man_page, "(woman \"%s\")", page); strbuf_addf(&man_page, "(woman \"%s\")", page);
execlp(path, "emacsclient", "-e", man_page.buf, NULL); execlp(path, "emacsclient", "-e", man_page.buf, NULL);
warning("failed to exec '%s': %s", path, strerror(errno)); warning("failed to exec '%s': %s", path,
strerror_r(errno, sbuf, sizeof(sbuf)));
} }
} }
static void exec_man_konqueror(const char *path, const char *page) static void exec_man_konqueror(const char *path, const char *page)
{ {
const char *display = getenv("DISPLAY"); const char *display = getenv("DISPLAY");
if (display && *display) { if (display && *display) {
struct strbuf man_page = STRBUF_INIT; struct strbuf man_page = STRBUF_INIT;
const char *filename = "kfmclient"; const char *filename = "kfmclient";
char sbuf[STRERR_BUFSIZE];
/* It's simpler to launch konqueror using kfmclient. */ /* It's simpler to launch konqueror using kfmclient. */
if (path) { if (path) {
...@@ -139,24 +144,31 @@ static void exec_man_konqueror(const char *path, const char *page) ...@@ -139,24 +144,31 @@ static void exec_man_konqueror(const char *path, const char *page)
path = "kfmclient"; path = "kfmclient";
strbuf_addf(&man_page, "man:%s(1)", page); strbuf_addf(&man_page, "man:%s(1)", page);
execlp(path, filename, "newTab", man_page.buf, NULL); execlp(path, filename, "newTab", man_page.buf, NULL);
warning("failed to exec '%s': %s", path, strerror(errno)); warning("failed to exec '%s': %s", path,
strerror_r(errno, sbuf, sizeof(sbuf)));
} }
} }
static void exec_man_man(const char *path, const char *page) static void exec_man_man(const char *path, const char *page)
{ {
char sbuf[STRERR_BUFSIZE];
if (!path) if (!path)
path = "man"; path = "man";
execlp(path, "man", page, NULL); execlp(path, "man", page, NULL);
warning("failed to exec '%s': %s", path, strerror(errno)); warning("failed to exec '%s': %s", path,
strerror_r(errno, sbuf, sizeof(sbuf)));
} }
static void exec_man_cmd(const char *cmd, const char *page) static void exec_man_cmd(const char *cmd, const char *page)
{ {
struct strbuf shell_cmd = STRBUF_INIT; struct strbuf shell_cmd = STRBUF_INIT;
char sbuf[STRERR_BUFSIZE];
strbuf_addf(&shell_cmd, "%s %s", cmd, page); strbuf_addf(&shell_cmd, "%s %s", cmd, page);
execl("/bin/sh", "sh", "-c", shell_cmd.buf, NULL); execl("/bin/sh", "sh", "-c", shell_cmd.buf, NULL);
warning("failed to exec '%s': %s", cmd, strerror(errno)); warning("failed to exec '%s': %s", cmd,
strerror_r(errno, sbuf, sizeof(sbuf)));
} }
static void add_man_viewer(const char *name) static void add_man_viewer(const char *name)
......
...@@ -990,6 +990,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm) ...@@ -990,6 +990,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
int err, rc = -1; int err, rc = -1;
struct perf_evsel *pos; struct perf_evsel *pos;
struct perf_evlist *evlist = kvm->evlist; struct perf_evlist *evlist = kvm->evlist;
char sbuf[STRERR_BUFSIZE];
perf_evlist__config(evlist, &kvm->opts); perf_evlist__config(evlist, &kvm->opts);
...@@ -1026,12 +1027,14 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm) ...@@ -1026,12 +1027,14 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
err = perf_evlist__open(evlist); err = perf_evlist__open(evlist);
if (err < 0) { if (err < 0) {
printf("Couldn't create the events: %s\n", strerror(errno)); printf("Couldn't create the events: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out; goto out;
} }
if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) { if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) {
ui__error("Failed to mmap the events: %s\n", strerror(errno)); ui__error("Failed to mmap the events: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
perf_evlist__close(evlist); perf_evlist__close(evlist);
goto out; goto out;
} }
......
...@@ -290,8 +290,11 @@ static void cleanup_params(void) ...@@ -290,8 +290,11 @@ static void cleanup_params(void)
static void pr_err_with_code(const char *msg, int err) static void pr_err_with_code(const char *msg, int err)
{ {
char sbuf[STRERR_BUFSIZE];
pr_err("%s", msg); pr_err("%s", msg);
pr_debug(" Reason: %s (Code: %d)", strerror(-err), err); pr_debug(" Reason: %s (Code: %d)",
strerror_r(-err, sbuf, sizeof(sbuf)), err);
pr_err("\n"); pr_err("\n");
} }
......
...@@ -161,7 +161,7 @@ static int record__open(struct record *rec) ...@@ -161,7 +161,7 @@ static int record__open(struct record *rec)
if (perf_evlist__apply_filters(evlist)) { if (perf_evlist__apply_filters(evlist)) {
error("failed to set filter with %d (%s)\n", errno, error("failed to set filter with %d (%s)\n", errno,
strerror(errno)); strerror_r(errno, msg, sizeof(msg)));
rc = -1; rc = -1;
goto out; goto out;
} }
...@@ -175,7 +175,8 @@ static int record__open(struct record *rec) ...@@ -175,7 +175,8 @@ static int record__open(struct record *rec)
"(current value: %u)\n", opts->mmap_pages); "(current value: %u)\n", opts->mmap_pages);
rc = -errno; rc = -errno;
} else { } else {
pr_err("failed to mmap with %d (%s)\n", errno, strerror(errno)); pr_err("failed to mmap with %d (%s)\n", errno,
strerror_r(errno, msg, sizeof(msg)));
rc = -errno; rc = -errno;
} }
goto out; goto out;
...@@ -480,7 +481,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) ...@@ -480,7 +481,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
} }
if (forks && workload_exec_errno) { if (forks && workload_exec_errno) {
char msg[512]; char msg[STRERR_BUFSIZE];
const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg)); const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg));
pr_err("Workload failed: %s\n", emsg); pr_err("Workload failed: %s\n", emsg);
err = -1; err = -1;
......
...@@ -428,6 +428,7 @@ static u64 get_cpu_usage_nsec_parent(void) ...@@ -428,6 +428,7 @@ static u64 get_cpu_usage_nsec_parent(void)
static int self_open_counters(void) static int self_open_counters(void)
{ {
struct perf_event_attr attr; struct perf_event_attr attr;
char sbuf[STRERR_BUFSIZE];
int fd; int fd;
memset(&attr, 0, sizeof(attr)); memset(&attr, 0, sizeof(attr));
...@@ -440,7 +441,8 @@ static int self_open_counters(void) ...@@ -440,7 +441,8 @@ static int self_open_counters(void)
if (fd < 0) if (fd < 0)
pr_err("Error: sys_perf_event_open() syscall returned " pr_err("Error: sys_perf_event_open() syscall returned "
"with %d (%s)\n", fd, strerror(errno)); "with %d (%s)\n", fd,
strerror_r(errno, sbuf, sizeof(sbuf)));
return fd; return fd;
} }
......
...@@ -593,7 +593,7 @@ static int __run_perf_stat(int argc, const char **argv) ...@@ -593,7 +593,7 @@ static int __run_perf_stat(int argc, const char **argv)
if (perf_evlist__apply_filters(evsel_list)) { if (perf_evlist__apply_filters(evsel_list)) {
error("failed to set filter with %d (%s)\n", errno, error("failed to set filter with %d (%s)\n", errno,
strerror(errno)); strerror_r(errno, msg, sizeof(msg)));
return -1; return -1;
} }
......
...@@ -899,7 +899,7 @@ static int perf_top__start_counters(struct perf_top *top) ...@@ -899,7 +899,7 @@ static int perf_top__start_counters(struct perf_top *top)
if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) { if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) {
ui__error("Failed to mmap with %d (%s)\n", ui__error("Failed to mmap with %d (%s)\n",
errno, strerror(errno)); errno, strerror_r(errno, msg, sizeof(msg)));
goto out_err; goto out_err;
} }
......
...@@ -1750,7 +1750,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel, ...@@ -1750,7 +1750,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
signed_print: signed_print:
fprintf(trace->output, ") = %d", ret); fprintf(trace->output, ") = %d", ret);
} else if (ret < 0 && sc->fmt->errmsg) { } else if (ret < 0 && sc->fmt->errmsg) {
char bf[256]; char bf[STRERR_BUFSIZE];
const char *emsg = strerror_r(-ret, bf, sizeof(bf)), const char *emsg = strerror_r(-ret, bf, sizeof(bf)),
*e = audit_errno_to_name(-ret); *e = audit_errno_to_name(-ret);
...@@ -2044,6 +2044,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) ...@@ -2044,6 +2044,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
int err = -1, i; int err = -1, i;
unsigned long before; unsigned long before;
const bool forks = argc > 0; const bool forks = argc > 0;
char sbuf[STRERR_BUFSIZE];
trace->live = true; trace->live = true;
...@@ -2105,7 +2106,8 @@ static int trace__run(struct trace *trace, int argc, const char **argv) ...@@ -2105,7 +2106,8 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
err = perf_evlist__mmap(evlist, trace->opts.mmap_pages, false); err = perf_evlist__mmap(evlist, trace->opts.mmap_pages, false);
if (err < 0) { if (err < 0) {
fprintf(trace->output, "Couldn't mmap the events: %s\n", strerror(errno)); fprintf(trace->output, "Couldn't mmap the events: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
......
...@@ -313,6 +313,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) ...@@ -313,6 +313,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
int status; int status;
struct stat st; struct stat st;
const char *prefix; const char *prefix;
char sbuf[STRERR_BUFSIZE];
prefix = NULL; prefix = NULL;
if (p->option & RUN_SETUP) if (p->option & RUN_SETUP)
...@@ -343,7 +344,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) ...@@ -343,7 +344,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
status = 1; status = 1;
/* Check for ENOSPC and EIO errors.. */ /* Check for ENOSPC and EIO errors.. */
if (fflush(stdout)) { if (fflush(stdout)) {
fprintf(stderr, "write failure on standard output: %s", strerror(errno)); fprintf(stderr, "write failure on standard output: %s",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out; goto out;
} }
if (ferror(stdout)) { if (ferror(stdout)) {
...@@ -351,7 +353,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) ...@@ -351,7 +353,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
goto out; goto out;
} }
if (fclose(stdout)) { if (fclose(stdout)) {
fprintf(stderr, "close failed on standard output: %s", strerror(errno)); fprintf(stderr, "close failed on standard output: %s",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out; goto out;
} }
status = 0; status = 0;
...@@ -466,6 +469,7 @@ void pthread__unblock_sigwinch(void) ...@@ -466,6 +469,7 @@ void pthread__unblock_sigwinch(void)
int main(int argc, const char **argv) int main(int argc, const char **argv)
{ {
const char *cmd; const char *cmd;
char sbuf[STRERR_BUFSIZE];
/* The page_size is placed in util object. */ /* The page_size is placed in util object. */
page_size = sysconf(_SC_PAGE_SIZE); page_size = sysconf(_SC_PAGE_SIZE);
...@@ -561,7 +565,7 @@ int main(int argc, const char **argv) ...@@ -561,7 +565,7 @@ int main(int argc, const char **argv)
} }
fprintf(stderr, "Failed to run command '%s': %s\n", fprintf(stderr, "Failed to run command '%s': %s\n",
cmd, strerror(errno)); cmd, strerror_r(errno, sbuf, sizeof(sbuf)));
out: out:
return 1; return 1;
} }
...@@ -185,9 +185,11 @@ static bool perf_test__matches(int curr, int argc, const char *argv[]) ...@@ -185,9 +185,11 @@ static bool perf_test__matches(int curr, int argc, const char *argv[])
static int run_test(struct test *test) static int run_test(struct test *test)
{ {
int status, err = -1, child = fork(); int status, err = -1, child = fork();
char sbuf[STRERR_BUFSIZE];
if (child < 0) { if (child < 0) {
pr_err("failed to fork test: %s\n", strerror(errno)); pr_err("failed to fork test: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
return -1; return -1;
} }
......
...@@ -31,6 +31,7 @@ int test__basic_mmap(void) ...@@ -31,6 +31,7 @@ int test__basic_mmap(void)
unsigned int nr_events[nsyscalls], unsigned int nr_events[nsyscalls],
expected_nr_events[nsyscalls], i, j; expected_nr_events[nsyscalls], i, j;
struct perf_evsel *evsels[nsyscalls], *evsel; struct perf_evsel *evsels[nsyscalls], *evsel;
char sbuf[STRERR_BUFSIZE];
threads = thread_map__new(-1, getpid(), UINT_MAX); threads = thread_map__new(-1, getpid(), UINT_MAX);
if (threads == NULL) { if (threads == NULL) {
...@@ -49,7 +50,7 @@ int test__basic_mmap(void) ...@@ -49,7 +50,7 @@ int test__basic_mmap(void)
sched_setaffinity(0, sizeof(cpu_set), &cpu_set); sched_setaffinity(0, sizeof(cpu_set), &cpu_set);
if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) { if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
pr_debug("sched_setaffinity() failed on CPU %d: %s ", pr_debug("sched_setaffinity() failed on CPU %d: %s ",
cpus->map[0], strerror(errno)); cpus->map[0], strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_free_cpus; goto out_free_cpus;
} }
...@@ -79,7 +80,7 @@ int test__basic_mmap(void) ...@@ -79,7 +80,7 @@ int test__basic_mmap(void)
if (perf_evsel__open(evsels[i], cpus, threads) < 0) { if (perf_evsel__open(evsels[i], cpus, threads) < 0) {
pr_debug("failed to open counter: %s, " pr_debug("failed to open counter: %s, "
"tweak /proc/sys/kernel/perf_event_paranoid?\n", "tweak /proc/sys/kernel/perf_event_paranoid?\n",
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
...@@ -89,7 +90,7 @@ int test__basic_mmap(void) ...@@ -89,7 +90,7 @@ int test__basic_mmap(void)
if (perf_evlist__mmap(evlist, 128, true) < 0) { if (perf_evlist__mmap(evlist, 128, true) < 0) {
pr_debug("failed to mmap events: %d (%s)\n", errno, pr_debug("failed to mmap events: %d (%s)\n", errno,
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
......
...@@ -12,6 +12,7 @@ int test__open_syscall_event_on_all_cpus(void) ...@@ -12,6 +12,7 @@ int test__open_syscall_event_on_all_cpus(void)
unsigned int nr_open_calls = 111, i; unsigned int nr_open_calls = 111, i;
cpu_set_t cpu_set; cpu_set_t cpu_set;
struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX); struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
char sbuf[STRERR_BUFSIZE];
if (threads == NULL) { if (threads == NULL) {
pr_debug("thread_map__new\n"); pr_debug("thread_map__new\n");
...@@ -35,7 +36,7 @@ int test__open_syscall_event_on_all_cpus(void) ...@@ -35,7 +36,7 @@ int test__open_syscall_event_on_all_cpus(void)
if (perf_evsel__open(evsel, cpus, threads) < 0) { if (perf_evsel__open(evsel, cpus, threads) < 0) {
pr_debug("failed to open counter: %s, " pr_debug("failed to open counter: %s, "
"tweak /proc/sys/kernel/perf_event_paranoid?\n", "tweak /proc/sys/kernel/perf_event_paranoid?\n",
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_evsel_delete; goto out_evsel_delete;
} }
...@@ -56,7 +57,7 @@ int test__open_syscall_event_on_all_cpus(void) ...@@ -56,7 +57,7 @@ int test__open_syscall_event_on_all_cpus(void)
if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) { if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
pr_debug("sched_setaffinity() failed on CPU %d: %s ", pr_debug("sched_setaffinity() failed on CPU %d: %s ",
cpus->map[cpu], cpus->map[cpu],
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_close_fd; goto out_close_fd;
} }
for (i = 0; i < ncalls; ++i) { for (i = 0; i < ncalls; ++i) {
......
...@@ -22,6 +22,7 @@ int test__syscall_open_tp_fields(void) ...@@ -22,6 +22,7 @@ int test__syscall_open_tp_fields(void)
struct perf_evlist *evlist = perf_evlist__new(); struct perf_evlist *evlist = perf_evlist__new();
struct perf_evsel *evsel; struct perf_evsel *evsel;
int err = -1, i, nr_events = 0, nr_polls = 0; int err = -1, i, nr_events = 0, nr_polls = 0;
char sbuf[STRERR_BUFSIZE];
if (evlist == NULL) { if (evlist == NULL) {
pr_debug("%s: perf_evlist__new\n", __func__); pr_debug("%s: perf_evlist__new\n", __func__);
...@@ -48,13 +49,15 @@ int test__syscall_open_tp_fields(void) ...@@ -48,13 +49,15 @@ int test__syscall_open_tp_fields(void)
err = perf_evlist__open(evlist); err = perf_evlist__open(evlist);
if (err < 0) { if (err < 0) {
pr_debug("perf_evlist__open: %s\n", strerror(errno)); pr_debug("perf_evlist__open: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
err = perf_evlist__mmap(evlist, UINT_MAX, false); err = perf_evlist__mmap(evlist, UINT_MAX, false);
if (err < 0) { if (err < 0) {
pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); pr_debug("perf_evlist__mmap: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
......
...@@ -9,6 +9,7 @@ int test__open_syscall_event(void) ...@@ -9,6 +9,7 @@ int test__open_syscall_event(void)
struct perf_evsel *evsel; struct perf_evsel *evsel;
unsigned int nr_open_calls = 111, i; unsigned int nr_open_calls = 111, i;
struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX); struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
char sbuf[STRERR_BUFSIZE];
if (threads == NULL) { if (threads == NULL) {
pr_debug("thread_map__new\n"); pr_debug("thread_map__new\n");
...@@ -24,7 +25,7 @@ int test__open_syscall_event(void) ...@@ -24,7 +25,7 @@ int test__open_syscall_event(void)
if (perf_evsel__open_per_thread(evsel, threads) < 0) { if (perf_evsel__open_per_thread(evsel, threads) < 0) {
pr_debug("failed to open counter: %s, " pr_debug("failed to open counter: %s, "
"tweak /proc/sys/kernel/perf_event_paranoid?\n", "tweak /proc/sys/kernel/perf_event_paranoid?\n",
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_evsel_delete; goto out_evsel_delete;
} }
......
...@@ -59,6 +59,7 @@ int test__PERF_RECORD(void) ...@@ -59,6 +59,7 @@ int test__PERF_RECORD(void)
int err = -1, errs = 0, i, wakeups = 0; int err = -1, errs = 0, i, wakeups = 0;
u32 cpu; u32 cpu;
int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, }; int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, };
char sbuf[STRERR_BUFSIZE];
if (evlist == NULL || argv == NULL) { if (evlist == NULL || argv == NULL) {
pr_debug("Not enough memory to create evlist\n"); pr_debug("Not enough memory to create evlist\n");
...@@ -100,7 +101,8 @@ int test__PERF_RECORD(void) ...@@ -100,7 +101,8 @@ int test__PERF_RECORD(void)
err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
if (err < 0) { if (err < 0) {
pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno)); pr_debug("sched__get_first_possible_cpu: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
...@@ -110,7 +112,8 @@ int test__PERF_RECORD(void) ...@@ -110,7 +112,8 @@ int test__PERF_RECORD(void)
* So that we can check perf_sample.cpu on all the samples. * So that we can check perf_sample.cpu on all the samples.
*/ */
if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) {
pr_debug("sched_setaffinity: %s\n", strerror(errno)); pr_debug("sched_setaffinity: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
...@@ -120,7 +123,8 @@ int test__PERF_RECORD(void) ...@@ -120,7 +123,8 @@ int test__PERF_RECORD(void)
*/ */
err = perf_evlist__open(evlist); err = perf_evlist__open(evlist);
if (err < 0) { if (err < 0) {
pr_debug("perf_evlist__open: %s\n", strerror(errno)); pr_debug("perf_evlist__open: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
...@@ -131,7 +135,8 @@ int test__PERF_RECORD(void) ...@@ -131,7 +135,8 @@ int test__PERF_RECORD(void)
*/ */
err = perf_evlist__mmap(evlist, opts.mmap_pages, false); err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
if (err < 0) { if (err < 0) {
pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); pr_debug("perf_evlist__mmap: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
......
...@@ -100,6 +100,7 @@ static int __test__rdpmc(void) ...@@ -100,6 +100,7 @@ static int __test__rdpmc(void)
}; };
u64 delta_sum = 0; u64 delta_sum = 0;
struct sigaction sa; struct sigaction sa;
char sbuf[STRERR_BUFSIZE];
sigfillset(&sa.sa_mask); sigfillset(&sa.sa_mask);
sa.sa_sigaction = segfault_handler; sa.sa_sigaction = segfault_handler;
...@@ -109,14 +110,15 @@ static int __test__rdpmc(void) ...@@ -109,14 +110,15 @@ static int __test__rdpmc(void)
perf_event_open_cloexec_flag()); perf_event_open_cloexec_flag());
if (fd < 0) { if (fd < 0) {
pr_err("Error: sys_perf_event_open() syscall returned " pr_err("Error: sys_perf_event_open() syscall returned "
"with %d (%s)\n", fd, strerror(errno)); "with %d (%s)\n", fd,
strerror_r(errno, sbuf, sizeof(sbuf)));
return -1; return -1;
} }
addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0); addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0);
if (addr == (void *)(-1)) { if (addr == (void *)(-1)) {
pr_err("Error: mmap() syscall returned with (%s)\n", pr_err("Error: mmap() syscall returned with (%s)\n",
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_close; goto out_close;
} }
......
...@@ -22,6 +22,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) ...@@ -22,6 +22,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
volatile int tmp = 0; volatile int tmp = 0;
u64 total_periods = 0; u64 total_periods = 0;
int nr_samples = 0; int nr_samples = 0;
char sbuf[STRERR_BUFSIZE];
union perf_event *event; union perf_event *event;
struct perf_evsel *evsel; struct perf_evsel *evsel;
struct perf_evlist *evlist; struct perf_evlist *evlist;
...@@ -62,14 +63,15 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) ...@@ -62,14 +63,15 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
err = -errno; err = -errno;
pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n", pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n",
strerror(errno), knob, (u64)attr.sample_freq); strerror_r(errno, sbuf, sizeof(sbuf)),
knob, (u64)attr.sample_freq);
goto out_delete_evlist; goto out_delete_evlist;
} }
err = perf_evlist__mmap(evlist, 128, true); err = perf_evlist__mmap(evlist, 128, true);
if (err < 0) { if (err < 0) {
pr_debug("failed to mmap event: %d (%s)\n", errno, pr_debug("failed to mmap event: %d (%s)\n", errno,
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
......
...@@ -42,6 +42,7 @@ int test__task_exit(void) ...@@ -42,6 +42,7 @@ int test__task_exit(void)
.uses_mmap = true, .uses_mmap = true,
}; };
const char *argv[] = { "true", NULL }; const char *argv[] = { "true", NULL };
char sbuf[STRERR_BUFSIZE];
signal(SIGCHLD, sig_handler); signal(SIGCHLD, sig_handler);
...@@ -82,13 +83,14 @@ int test__task_exit(void) ...@@ -82,13 +83,14 @@ int test__task_exit(void)
err = perf_evlist__open(evlist); err = perf_evlist__open(evlist);
if (err < 0) { if (err < 0) {
pr_debug("Couldn't open the evlist: %s\n", strerror(-err)); pr_debug("Couldn't open the evlist: %s\n",
strerror_r(-err, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
if (perf_evlist__mmap(evlist, 128, true) < 0) { if (perf_evlist__mmap(evlist, 128, true) < 0) {
pr_debug("failed to mmap events: %d (%s)\n", errno, pr_debug("failed to mmap events: %d (%s)\n", errno,
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
goto out_delete_evlist; goto out_delete_evlist;
} }
......
...@@ -232,9 +232,16 @@ static int mov__parse(struct ins_operands *ops) ...@@ -232,9 +232,16 @@ static int mov__parse(struct ins_operands *ops)
return -1; return -1;
target = ++s; target = ++s;
comment = strchr(s, '#');
while (s[0] != '\0' && !isspace(s[0])) if (comment != NULL)
++s; s = comment - 1;
else
s = strchr(s, '\0') - 1;
while (s > target && isspace(s[0]))
--s;
s++;
prev = *s; prev = *s;
*s = '\0'; *s = '\0';
...@@ -244,7 +251,6 @@ static int mov__parse(struct ins_operands *ops) ...@@ -244,7 +251,6 @@ static int mov__parse(struct ins_operands *ops)
if (ops->target.raw == NULL) if (ops->target.raw == NULL)
goto out_free_source; goto out_free_source;
comment = strchr(s, '#');
if (comment == NULL) if (comment == NULL)
return 0; return 0;
......
...@@ -28,74 +28,55 @@ __thread struct callchain_cursor callchain_cursor; ...@@ -28,74 +28,55 @@ __thread struct callchain_cursor callchain_cursor;
int int
parse_callchain_report_opt(const char *arg) parse_callchain_report_opt(const char *arg)
{ {
char *tok, *tok2; char *tok;
char *endptr; char *endptr;
bool minpcnt_set = false;
symbol_conf.use_callchain = true; symbol_conf.use_callchain = true;
if (!arg) if (!arg)
return 0; return 0;
tok = strtok((char *)arg, ","); while ((tok = strtok((char *)arg, ",")) != NULL) {
if (!tok) if (!strncmp(tok, "none", strlen(tok))) {
return -1;
/* get the output mode */
if (!strncmp(tok, "graph", strlen(arg))) {
callchain_param.mode = CHAIN_GRAPH_ABS;
} else if (!strncmp(tok, "flat", strlen(arg))) {
callchain_param.mode = CHAIN_FLAT;
} else if (!strncmp(tok, "fractal", strlen(arg))) {
callchain_param.mode = CHAIN_GRAPH_REL;
} else if (!strncmp(tok, "none", strlen(arg))) {
callchain_param.mode = CHAIN_NONE; callchain_param.mode = CHAIN_NONE;
symbol_conf.use_callchain = false; symbol_conf.use_callchain = false;
return 0; return 0;
} else {
return -1;
} }
/* get the min percentage */ /* try to get the output mode */
tok = strtok(NULL, ","); if (!strncmp(tok, "graph", strlen(tok)))
if (!tok) callchain_param.mode = CHAIN_GRAPH_ABS;
goto setup; else if (!strncmp(tok, "flat", strlen(tok)))
callchain_param.mode = CHAIN_FLAT;
else if (!strncmp(tok, "fractal", strlen(tok)))
callchain_param.mode = CHAIN_GRAPH_REL;
/* try to get the call chain order */
else if (!strncmp(tok, "caller", strlen(tok)))
callchain_param.order = ORDER_CALLER;
else if (!strncmp(tok, "callee", strlen(tok)))
callchain_param.order = ORDER_CALLEE;
/* try to get the sort key */
else if (!strncmp(tok, "function", strlen(tok)))
callchain_param.key = CCKEY_FUNCTION;
else if (!strncmp(tok, "address", strlen(tok)))
callchain_param.key = CCKEY_ADDRESS;
/* try to get the min percent */
else if (!minpcnt_set) {
callchain_param.min_percent = strtod(tok, &endptr); callchain_param.min_percent = strtod(tok, &endptr);
if (tok == endptr) if (tok == endptr)
return -1; return -1;
minpcnt_set = true;
/* get the print limit */ } else {
tok2 = strtok(NULL, ","); /* try print limit at last */
if (!tok2) callchain_param.print_limit = strtoul(tok, &endptr, 0);
goto setup; if (tok == endptr)
return -1;
if (tok2[0] != 'c') {
callchain_param.print_limit = strtoul(tok2, &endptr, 0);
tok2 = strtok(NULL, ",");
if (!tok2)
goto setup;
} }
/* get the call chain order */ arg = NULL;
if (!strncmp(tok2, "caller", strlen("caller"))) }
callchain_param.order = ORDER_CALLER;
else if (!strncmp(tok2, "callee", strlen("callee")))
callchain_param.order = ORDER_CALLEE;
else
return -1;
/* Get the sort key */
tok2 = strtok(NULL, ",");
if (!tok2)
goto setup;
if (!strncmp(tok2, "function", strlen("function")))
callchain_param.key = CCKEY_FUNCTION;
else if (!strncmp(tok2, "address", strlen("address")))
callchain_param.key = CCKEY_ADDRESS;
else
return -1;
setup:
if (callchain_register_param(&callchain_param) < 0) { if (callchain_register_param(&callchain_param) < 0) {
pr_err("Can't register callchain params\n"); pr_err("Can't register callchain params\n");
return -1; return -1;
......
...@@ -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;
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#define __PERF_DEBUG_H #define __PERF_DEBUG_H
#include <stdbool.h> #include <stdbool.h>
#include <string.h>
#include "event.h" #include "event.h"
#include "../ui/helpline.h" #include "../ui/helpline.h"
#include "../ui/progress.h" #include "../ui/progress.h"
...@@ -36,6 +37,8 @@ extern int debug_ordered_events; ...@@ -36,6 +37,8 @@ extern int debug_ordered_events;
#define pr_oe_time(t, fmt, ...) pr_time_N(1, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__) #define pr_oe_time(t, fmt, ...) pr_time_N(1, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__)
#define pr_oe_time2(t, fmt, ...) pr_time_N(2, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__) #define pr_oe_time2(t, fmt, ...) pr_time_N(2, debug_ordered_events, t, pr_fmt(fmt), ##__VA_ARGS__)
#define STRERR_BUFSIZE 128 /* For the buffer size of strerror_r */
int dump_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); int dump_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
void trace_event(union perf_event *event); void trace_event(union perf_event *event);
......
...@@ -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;
} }
......
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
struct perf_pmu_alias { struct perf_pmu_alias {
char *name; char *name;
struct list_head terms; struct list_head terms; /* HEAD struct parse_events_term -> list */
struct list_head list; struct list_head list; /* ELEM */
char unit[UNIT_MAX_LEN+1]; char unit[UNIT_MAX_LEN+1];
double scale; double scale;
}; };
......
...@@ -17,9 +17,9 @@ struct perf_pmu { ...@@ -17,9 +17,9 @@ struct perf_pmu {
char *name; char *name;
__u32 type; __u32 type;
struct cpu_map *cpus; struct cpu_map *cpus;
struct list_head format; struct list_head format; /* HEAD struct perf_pmu_format -> list */
struct list_head aliases; struct list_head aliases; /* HEAD struct perf_pmu_alias -> list */
struct list_head list; struct list_head list; /* ELEM */
}; };
struct perf_pmu *perf_pmu__find(const char *name); struct perf_pmu *perf_pmu__find(const char *name);
......
...@@ -258,21 +258,33 @@ static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs) ...@@ -258,21 +258,33 @@ static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs)
#ifdef HAVE_DWARF_SUPPORT #ifdef HAVE_DWARF_SUPPORT
/* Open new debuginfo of given module */ /* Open new debuginfo of given module */
static struct debuginfo *open_debuginfo(const char *module) static struct debuginfo *open_debuginfo(const char *module, bool silent)
{ {
const char *path = module; const char *path = module;
struct debuginfo *ret;
if (!module || !strchr(module, '/')) { if (!module || !strchr(module, '/')) {
path = kernel_get_module_path(module); path = kernel_get_module_path(module);
if (!path) { if (!path) {
if (!silent)
pr_err("Failed to find path of %s module.\n", pr_err("Failed to find path of %s module.\n",
module ?: "kernel"); module ?: "kernel");
return NULL; return NULL;
} }
} }
return debuginfo__new(path); ret = debuginfo__new(path);
if (!ret && !silent) {
pr_warning("The %s file has no debug information.\n", path);
if (!module || !strtailcmp(path, ".ko"))
pr_warning("Rebuild with CONFIG_DEBUG_INFO=y, ");
else
pr_warning("Rebuild with -g, ");
pr_warning("or install an appropriate debuginfo package.\n");
}
return ret;
} }
static int get_text_start_address(const char *exec, unsigned long *address) static int get_text_start_address(const char *exec, unsigned long *address)
{ {
Elf *elf; Elf *elf;
...@@ -333,15 +345,13 @@ static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp, ...@@ -333,15 +345,13 @@ static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp,
pr_debug("try to find information at %" PRIx64 " in %s\n", addr, pr_debug("try to find information at %" PRIx64 " in %s\n", addr,
tp->module ? : "kernel"); tp->module ? : "kernel");
dinfo = open_debuginfo(tp->module); dinfo = open_debuginfo(tp->module, verbose == 0);
if (dinfo) { if (dinfo) {
ret = debuginfo__find_probe_point(dinfo, ret = debuginfo__find_probe_point(dinfo,
(unsigned long)addr, pp); (unsigned long)addr, pp);
debuginfo__delete(dinfo); debuginfo__delete(dinfo);
} else { } else
pr_debug("Failed to open debuginfo at 0x%" PRIx64 "\n", addr);
ret = -ENOENT; ret = -ENOENT;
}
if (ret > 0) { if (ret > 0) {
pp->retprobe = tp->retprobe; pp->retprobe = tp->retprobe;
...@@ -457,13 +467,11 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, ...@@ -457,13 +467,11 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
struct debuginfo *dinfo; struct debuginfo *dinfo;
int ntevs, ret = 0; int ntevs, ret = 0;
dinfo = open_debuginfo(target); dinfo = open_debuginfo(target, !need_dwarf);
if (!dinfo) { if (!dinfo) {
if (need_dwarf) { if (need_dwarf)
pr_warning("Failed to open debuginfo file.\n");
return -ENOENT; return -ENOENT;
}
pr_debug("Could not open debuginfo. Try to use symbols.\n"); pr_debug("Could not open debuginfo. Try to use symbols.\n");
return 0; return 0;
} }
...@@ -565,7 +573,7 @@ static int get_real_path(const char *raw_path, const char *comp_dir, ...@@ -565,7 +573,7 @@ static int get_real_path(const char *raw_path, const char *comp_dir,
static int __show_one_line(FILE *fp, int l, bool skip, bool show_num) static int __show_one_line(FILE *fp, int l, bool skip, bool show_num)
{ {
char buf[LINEBUF_SIZE]; char buf[LINEBUF_SIZE], sbuf[STRERR_BUFSIZE];
const char *color = show_num ? "" : PERF_COLOR_BLUE; const char *color = show_num ? "" : PERF_COLOR_BLUE;
const char *prefix = NULL; const char *prefix = NULL;
...@@ -585,7 +593,8 @@ static int __show_one_line(FILE *fp, int l, bool skip, bool show_num) ...@@ -585,7 +593,8 @@ static int __show_one_line(FILE *fp, int l, bool skip, bool show_num)
return 1; return 1;
error: error:
if (ferror(fp)) { if (ferror(fp)) {
pr_warning("File read error: %s\n", strerror(errno)); pr_warning("File read error: %s\n",
strerror_r(errno, sbuf, sizeof(sbuf)));
return -1; return -1;
} }
return 0; return 0;
...@@ -618,13 +627,12 @@ static int __show_line_range(struct line_range *lr, const char *module) ...@@ -618,13 +627,12 @@ static int __show_line_range(struct line_range *lr, const char *module)
FILE *fp; FILE *fp;
int ret; int ret;
char *tmp; char *tmp;
char sbuf[STRERR_BUFSIZE];
/* Search a line range */ /* Search a line range */
dinfo = open_debuginfo(module); dinfo = open_debuginfo(module, false);
if (!dinfo) { if (!dinfo)
pr_warning("Failed to open debuginfo file.\n");
return -ENOENT; return -ENOENT;
}
ret = debuginfo__find_line_range(dinfo, lr); ret = debuginfo__find_line_range(dinfo, lr);
debuginfo__delete(dinfo); debuginfo__delete(dinfo);
...@@ -656,7 +664,7 @@ static int __show_line_range(struct line_range *lr, const char *module) ...@@ -656,7 +664,7 @@ static int __show_line_range(struct line_range *lr, const char *module)
fp = fopen(lr->path, "r"); fp = fopen(lr->path, "r");
if (fp == NULL) { if (fp == NULL) {
pr_warning("Failed to open %s: %s\n", lr->path, pr_warning("Failed to open %s: %s\n", lr->path,
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
return -errno; return -errno;
} }
/* Skip to starting line number */ /* Skip to starting line number */
...@@ -772,9 +780,8 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs, ...@@ -772,9 +780,8 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs,
if (ret < 0) if (ret < 0)
return ret; return ret;
dinfo = open_debuginfo(module); dinfo = open_debuginfo(module, false);
if (!dinfo) { if (!dinfo) {
pr_warning("Failed to open debuginfo file.\n");
ret = -ENOENT; ret = -ENOENT;
goto out; goto out;
} }
...@@ -1405,8 +1412,7 @@ int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len) ...@@ -1405,8 +1412,7 @@ int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len)
return tmp - buf; return tmp - buf;
error: error:
pr_debug("Failed to synthesize perf probe argument: %s\n", pr_debug("Failed to synthesize perf probe argument: %d\n", ret);
strerror(-ret));
return ret; return ret;
} }
...@@ -1455,8 +1461,7 @@ static char *synthesize_perf_probe_point(struct perf_probe_point *pp) ...@@ -1455,8 +1461,7 @@ static char *synthesize_perf_probe_point(struct perf_probe_point *pp)
return buf; return buf;
error: error:
pr_debug("Failed to synthesize perf probe point: %s\n", pr_debug("Failed to synthesize perf probe point: %d\n", ret);
strerror(-ret));
free(buf); free(buf);
return NULL; return NULL;
} }
...@@ -1782,7 +1787,7 @@ static void clear_probe_trace_event(struct probe_trace_event *tev) ...@@ -1782,7 +1787,7 @@ static void clear_probe_trace_event(struct probe_trace_event *tev)
static void print_open_warning(int err, bool is_kprobe) static void print_open_warning(int err, bool is_kprobe)
{ {
char sbuf[128]; char sbuf[STRERR_BUFSIZE];
if (err == -ENOENT) { if (err == -ENOENT) {
const char *config; const char *config;
...@@ -1812,7 +1817,7 @@ static void print_both_open_warning(int kerr, int uerr) ...@@ -1812,7 +1817,7 @@ static void print_both_open_warning(int kerr, int uerr)
pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS " pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS "
"or/and CONFIG_UPROBE_EVENTS.\n"); "or/and CONFIG_UPROBE_EVENTS.\n");
else { else {
char sbuf[128]; char sbuf[STRERR_BUFSIZE];
pr_warning("Failed to open kprobe events: %s.\n", pr_warning("Failed to open kprobe events: %s.\n",
strerror_r(-kerr, sbuf, sizeof(sbuf))); strerror_r(-kerr, sbuf, sizeof(sbuf)));
pr_warning("Failed to open uprobe events: %s.\n", pr_warning("Failed to open uprobe events: %s.\n",
...@@ -1876,7 +1881,7 @@ static struct strlist *get_probe_trace_command_rawlist(int fd) ...@@ -1876,7 +1881,7 @@ static struct strlist *get_probe_trace_command_rawlist(int fd)
p[idx] = '\0'; p[idx] = '\0';
ret = strlist__add(sl, buf); ret = strlist__add(sl, buf);
if (ret < 0) { if (ret < 0) {
pr_debug("strlist__add failed: %s\n", strerror(-ret)); pr_debug("strlist__add failed (%d)\n", ret);
strlist__delete(sl); strlist__delete(sl);
return NULL; return NULL;
} }
...@@ -1935,7 +1940,7 @@ static int __show_perf_probe_events(int fd, bool is_kprobe) ...@@ -1935,7 +1940,7 @@ static int __show_perf_probe_events(int fd, bool is_kprobe)
rawlist = get_probe_trace_command_rawlist(fd); rawlist = get_probe_trace_command_rawlist(fd);
if (!rawlist) if (!rawlist)
return -ENOENT; return -ENOMEM;
strlist__for_each(ent, rawlist) { strlist__for_each(ent, rawlist) {
ret = parse_probe_trace_command(ent->s, &tev); 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,6 +2007,8 @@ static struct strlist *get_probe_trace_event_names(int fd, bool include_group)
memset(&tev, 0, sizeof(tev)); memset(&tev, 0, sizeof(tev));
rawlist = get_probe_trace_command_rawlist(fd); rawlist = get_probe_trace_command_rawlist(fd);
if (!rawlist)
return NULL;
sl = strlist__new(true, NULL); sl = strlist__new(true, NULL);
strlist__for_each(ent, rawlist) { strlist__for_each(ent, rawlist) {
ret = parse_probe_trace_command(ent->s, &tev); 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,6 +2038,7 @@ static int write_probe_trace_event(int fd, struct probe_trace_event *tev)
{ {
int ret = 0; int ret = 0;
char *buf = synthesize_probe_trace_command(tev); char *buf = synthesize_probe_trace_command(tev);
char sbuf[STRERR_BUFSIZE];
if (!buf) { if (!buf) {
pr_debug("Failed to synthesize probe trace event.\n"); 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,7 +2050,7 @@ static int write_probe_trace_event(int fd, struct probe_trace_event *tev)
ret = write(fd, buf, strlen(buf)); ret = write(fd, buf, strlen(buf));
if (ret <= 0) if (ret <= 0)
pr_warning("Failed to write event: %s\n", pr_warning("Failed to write event: %s\n",
strerror(errno)); strerror_r(errno, sbuf, sizeof(sbuf)));
} }
free(buf); free(buf);
return ret; return ret;
...@@ -2056,7 +2064,7 @@ static int get_new_event_name(char *buf, size_t len, const char *base, ...@@ -2056,7 +2064,7 @@ static int get_new_event_name(char *buf, size_t len, const char *base,
/* Try no suffix */ /* Try no suffix */
ret = e_snprintf(buf, len, "%s", base); ret = e_snprintf(buf, len, "%s", base);
if (ret < 0) { if (ret < 0) {
pr_debug("snprintf() failed: %s\n", strerror(-ret)); pr_debug("snprintf() failed: %d\n", ret);
return ret; return ret;
} }
if (!strlist__has_entry(namelist, buf)) 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,7 +2080,7 @@ static int get_new_event_name(char *buf, size_t len, const char *base,
for (i = 1; i < MAX_EVENT_INDEX; i++) { for (i = 1; i < MAX_EVENT_INDEX; i++) {
ret = e_snprintf(buf, len, "%s_%d", base, i); ret = e_snprintf(buf, len, "%s_%d", base, i);
if (ret < 0) { if (ret < 0) {
pr_debug("snprintf() failed: %s\n", strerror(-ret)); pr_debug("snprintf() failed: %d\n", ret);
return ret; return ret;
} }
if (!strlist__has_entry(namelist, buf)) if (!strlist__has_entry(namelist, buf))
...@@ -2437,7 +2445,8 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) ...@@ -2437,7 +2445,8 @@ static int __del_trace_probe_event(int fd, struct str_node *ent)
printf("Removed event: %s\n", ent->s); printf("Removed event: %s\n", ent->s);
return 0; return 0;
error: error:
pr_warning("Failed to delete event: %s\n", strerror(-ret)); pr_warning("Failed to delete event: %s\n",
strerror_r(-ret, buf, sizeof(buf)));
return ret; return ret;
} }
......
...@@ -281,6 +281,7 @@ static int convert_variable_type(Dwarf_Die *vr_die, ...@@ -281,6 +281,7 @@ static int convert_variable_type(Dwarf_Die *vr_die,
struct probe_trace_arg_ref **ref_ptr = &tvar->ref; struct probe_trace_arg_ref **ref_ptr = &tvar->ref;
Dwarf_Die type; Dwarf_Die type;
char buf[16]; char buf[16];
char sbuf[STRERR_BUFSIZE];
int bsize, boffs, total; int bsize, boffs, total;
int ret; int ret;
...@@ -367,7 +368,7 @@ static int convert_variable_type(Dwarf_Die *vr_die, ...@@ -367,7 +368,7 @@ static int convert_variable_type(Dwarf_Die *vr_die,
if (ret >= 16) if (ret >= 16)
ret = -E2BIG; ret = -E2BIG;
pr_warning("Failed to convert variable type: %s\n", pr_warning("Failed to convert variable type: %s\n",
strerror(-ret)); strerror_r(-ret, sbuf, sizeof(sbuf)));
return ret; return ret;
} }
tvar->type = strdup(buf); tvar->type = strdup(buf);
...@@ -779,10 +780,12 @@ static int find_lazy_match_lines(struct intlist *list, ...@@ -779,10 +780,12 @@ static int find_lazy_match_lines(struct intlist *list,
size_t line_len; size_t line_len;
ssize_t len; ssize_t len;
int count = 0, linenum = 1; int count = 0, linenum = 1;
char sbuf[STRERR_BUFSIZE];
fp = fopen(fname, "r"); fp = fopen(fname, "r");
if (!fp) { if (!fp) {
pr_warning("Failed to open %s: %s\n", fname, strerror(errno)); pr_warning("Failed to open %s: %s\n", fname,
strerror_r(errno, sbuf, sizeof(sbuf)));
return -errno; return -errno;
} }
......
#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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册