Commit b48543c4 authored by Tiezhu Yang's avatar Tiezhu Yang Committed by Arnaldo Carvalho de Melo

perf list: Give clues if failed to open tracing events directory

When executing the command "perf list", I met "Error: failed to open
tracing events directory" twice, the first reason is that there is no
"/sys/kernel/tracing/events" directory due to it does not enable the
kernel tracing infrastructure with CONFIG_FTRACE, the second reason
is that there is no root privileges.

Add the error string to tell the users what happened and what should
to do, and also call put_tracing_file() to free events_path a little
later to avoid messy code in the error message.

At the same time, just remove the redundant "/" of the file path in
the function get_tracing_file(), otherwise it shows something like
"/sys/kernel/tracing//events".

Before:

  $ ./perf list
  Error: failed to open tracing events directory

After:

(1) Without CONFIG_FTRACE

  $ ./perf list
  Error: failed to open tracing events directory
  /sys/kernel/tracing/events: No such file or directory

(2) With CONFIG_FTRACE but no root privileges

  $ ./perf list
  Error: failed to open tracing events directory
  /sys/kernel/tracing/events: Permission denied

Committer testing:

Redirect stdout to null to quickly test the patch:

Before:

  $ perf list > /dev/null
  Error: failed to open tracing events directory
  $

After:

  $ perf list > /dev/null
  Error: failed to open tracing events directory
  /sys/kernel/tracing/events: Permission denied
  $
Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/lkml/20240730062301.23244-3-yangtiezhu@loongson.cnSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 839b1832
...@@ -69,7 +69,7 @@ char *get_tracing_file(const char *name) ...@@ -69,7 +69,7 @@ char *get_tracing_file(const char *name)
{ {
char *file; char *file;
if (asprintf(&file, "%s/%s", tracing_path_mount(), name) < 0) if (asprintf(&file, "%s%s", tracing_path_mount(), name) < 0)
return NULL; return NULL;
return file; return file;
......
...@@ -68,11 +68,12 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus ...@@ -68,11 +68,12 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus
struct dirent **sys_namelist = NULL; struct dirent **sys_namelist = NULL;
int sys_items; int sys_items;
put_tracing_file(events_path);
if (events_fd < 0) { if (events_fd < 0) {
pr_err("Error: failed to open tracing events directory\n"); pr_err("Error: failed to open tracing events directory\n");
pr_err("%s: %s\n", events_path, strerror(errno));
return; return;
} }
put_tracing_file(events_path);
sys_items = tracing_events__scandir_alphasort(&sys_namelist); sys_items = tracing_events__scandir_alphasort(&sys_namelist);
......
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