2013-10-03 09:12:51

by Ramkumar Ramachandra

[permalink] [raw]
Subject: [PATCH] perf tool: report user-friendly error from timechart

Earlier, when 'timechart record' was invoked by a user without
permissions to debugfs:

$ perf timechart record
invalid or unsupported event: 'power:cpu_frequency'
Run 'perf list' for a list of valid events

usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
[... detailed usage information ...]

This is highly user unfriendly, as the real problem is not reported to
the user correctly. Now, the user gets a much more friendly:

$ perf timechart record
Error: No permissions to read $debugfs/tracing/events/power/cpu_frequency
Hint: Change the permissions of debugfs: /sys/kernel/debug
The directory will be present if your kernel was compiled with debugfs support.

Cc: Ingo Molnar <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Ramkumar Ramachandra <[email protected]>
---
tools/perf/builtin-timechart.c | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
index c2e0231..ceaf9b8 100644
--- a/tools/perf/builtin-timechart.c
+++ b/tools/perf/builtin-timechart.c
@@ -1056,6 +1056,14 @@ static int __cmd_record(int argc, const char **argv)
}
#endif

+ /* Perform a quick sanity check */
+ if (!is_valid_tracepoint("power:cpu_frequency")) {
+ fprintf(stderr, "Error:\tNo permissions to read $debugfs/tracing/events/power/cpu_frequency\n");
+ fprintf(stderr, "Hint:\tChange the permissions of debugfs: /sys/kernel/debug\n");
+ fprintf(stderr, "\tThe directory will be present if your kernel was compiled with debugfs support.\n");
+ return 1;
+ }
+
rec_argc = record_elems + argc - 1;
rec_argv = calloc(rec_argc + 1, sizeof(char *));

--
1.8.4.477.g5d89aa9


2013-10-03 12:38:25

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] perf tool: report user-friendly error from timechart


* Ramkumar Ramachandra <[email protected]> wrote:

> + /* Perform a quick sanity check */
> + if (!is_valid_tracepoint("power:cpu_frequency")) {
> + fprintf(stderr, "Error:\tNo permissions to read $debugfs/tracing/events/power/cpu_frequency\n");
> + fprintf(stderr, "Hint:\tChange the permissions of debugfs: /sys/kernel/debug\n");
> + fprintf(stderr, "\tThe directory will be present if your kernel was compiled with debugfs support.\n");

Is missing permissions the only way how is_valid_tracepoint() can fail?

What if debugfs has the right permissions but CONFIG_TRACEPOINTS is
disabled in the kernel?

Thanks,

Ingo

2013-10-03 12:44:41

by Ramkumar Ramachandra

[permalink] [raw]
Subject: Re: [PATCH] perf tool: report user-friendly error from timechart

Ingo Molnar wrote:
>> + /* Perform a quick sanity check */
>> + if (!is_valid_tracepoint("power:cpu_frequency")) {
>> + fprintf(stderr, "Error:\tNo permissions to read $debugfs/tracing/events/power/cpu_frequency\n");
>> + fprintf(stderr, "Hint:\tChange the permissions of debugfs: /sys/kernel/debug\n");
>> + fprintf(stderr, "\tThe directory will be present if your kernel was compiled with debugfs support.\n");
>
> Is missing permissions the only way how is_valid_tracepoint() can fail?
>
> What if debugfs has the right permissions but CONFIG_TRACEPOINTS is
> disabled in the kernel?

I'm thinking about all this in terms of files present in debugfs. Will
the cpu_frequecy file be present if tracepoints is disabled? (should I
quickly check using User-Mode Linux?). If it won't be present, then we
can just change the last line to "compiled with debugfs and
tracepoints support".

2013-10-03 13:10:01

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] perf tool: report user-friendly error from timechart


* Ramkumar Ramachandra <[email protected]> wrote:

> Ingo Molnar wrote:
> >> + /* Perform a quick sanity check */
> >> + if (!is_valid_tracepoint("power:cpu_frequency")) {
> >> + fprintf(stderr, "Error:\tNo permissions to read $debugfs/tracing/events/power/cpu_frequency\n");
> >> + fprintf(stderr, "Hint:\tChange the permissions of debugfs: /sys/kernel/debug\n");
> >> + fprintf(stderr, "\tThe directory will be present if your kernel was compiled with debugfs support.\n");
> >
> > Is missing permissions the only way how is_valid_tracepoint() can fail?
> >
> > What if debugfs has the right permissions but CONFIG_TRACEPOINTS is
> > disabled in the kernel?
>
> I'm thinking about all this in terms of files present in debugfs. Will
> the cpu_frequecy file be present if tracepoints is disabled? (should I
> quickly check using User-Mode Linux?). If it won't be present, then we
> can just change the last line to "compiled with debugfs and tracepoints
> support".

The debug/tracing/events directory won't be present if tracing is
disabled.

Thanks,

Ingo

2013-10-03 13:35:23

by David Ahern

[permalink] [raw]
Subject: Re: [PATCH] perf tool: report user-friendly error from timechart

On 10/3/13 6:38 AM, Ingo Molnar wrote:
>
> * Ramkumar Ramachandra <[email protected]> wrote:
>
>> + /* Perform a quick sanity check */
>> + if (!is_valid_tracepoint("power:cpu_frequency")) {
>> + fprintf(stderr, "Error:\tNo permissions to read $debugfs/tracing/events/power/cpu_frequency\n");
>> + fprintf(stderr, "Hint:\tChange the permissions of debugfs: /sys/kernel/debug\n");
>> + fprintf(stderr, "\tThe directory will be present if your kernel was compiled with debugfs support.\n");
>
> Is missing permissions the only way how is_valid_tracepoint() can fail?
>
> What if debugfs has the right permissions but CONFIG_TRACEPOINTS is
> disabled in the kernel?

There are a number of reasons that function can fail. The complete
solution is to plumb various error numbers and on failure request a
string for that failure. Take a look at util/target.[ch] as an example.

The comment applies to the perf-trace patch as well, but it gets more
complicated to handle the error paths from perf_evsel__newtp when they
dip into the tracepoint code

David

2013-10-03 17:08:18

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] perf tool: report user-friendly error from timechart

Em Thu, Oct 03, 2013 at 07:35:18AM -0600, David Ahern escreveu:
> On 10/3/13 6:38 AM, Ingo Molnar wrote:
> >
> >* Ramkumar Ramachandra <[email protected]> wrote:
> >
> >>+ /* Perform a quick sanity check */
> >>+ if (!is_valid_tracepoint("power:cpu_frequency")) {
> >>+ fprintf(stderr, "Error:\tNo permissions to read $debugfs/tracing/events/power/cpu_frequency\n");
> >>+ fprintf(stderr, "Hint:\tChange the permissions of debugfs: /sys/kernel/debug\n");
> >>+ fprintf(stderr, "\tThe directory will be present if your kernel was compiled with debugfs support.\n");
> >
> >Is missing permissions the only way how is_valid_tracepoint() can fail?
> >
> >What if debugfs has the right permissions but CONFIG_TRACEPOINTS is
> >disabled in the kernel?
>
> There are a number of reasons that function can fail. The complete
> solution is to plumb various error numbers and on failure request a
> string for that failure. Take a look at util/target.[ch] as an
> example.
>
> The comment applies to the perf-trace patch as well, but it gets
> more complicated to handle the error paths from perf_evsel__newtp
> when they dip into the tracepoint code

See the patch I posted, in that case we can use the old errno way, i.e.
do nothing and just look at it in the perf_evsel__newtp/
perf_evlist__add_newtp callers.

And is_valid_tracepoint() is a too big hammer, it traverses the whole
directory looking for a match instead of plain build the path and do an
access, its one of those things I need to ditch at some point. So far I
just try to do a perf_evlist__add_newtp and if it fails, look at errno.

- Arnaldo

2013-10-03 17:22:31

by David Ahern

[permalink] [raw]
Subject: Re: [PATCH] perf tool: report user-friendly error from timechart

On 10/3/13 11:08 AM, Arnaldo Carvalho de Melo wrote:

> And is_valid_tracepoint() is a too big hammer, it traverses the whole
> directory looking for a match instead of plain build the path and do an
> access, its one of those things I need to ditch at some point. So far I
> just try to do a perf_evlist__add_newtp and if it fails, look at errno.

And a number of tracepoints depend on CONFIG settings so it is more than
just looking at whether debugfs is mounted and accessible/readable.
e.g., look at the message I put into perf-lock

David