perf evlist: Handle -EINVAL for sample_freq > max_sample_rate in strerror_open()
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: d9aade7fd27a604bbffd363e6a68416ef51bab88 Gitweb: http://git.kernel.org/tip/d9aade7fd27a604bbffd363e6a68416ef51bab88 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 18 Feb 2016 13:34:09 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 19 Feb 2016 19:12:42 -0300
perf evlist: Handle -EINVAL for sample_freq > max_sample_rate in strerror_open()
When running the "code reading" test we get:
# perf test -v "code reading" 2>&1 | tail -5 Parsing event 'cycles:u' perf_evlist__open failed test child finished with -1 ---- end ---- Test object code reading: FAILED! #
And with -vv we get the errno value, -22, i.e. -EINVAL, but we can do better and handle the case at hand, with this patch it becomes:
# perf test -v "code reading" 2>&1 | tail -7 perf_evlist__open() failed! Error: Invalid argument. Hint: Check /proc/sys/kernel/perf_event_max_sample_rate. Hint: The current value is 1000 and 4000 is being requested. test child finished with -1 ---- end ---- Test object code reading: FAILED! #
Next patch will make this 'perf test' entry to use perf_evlist__strerror()
Cc Adrian Hunter <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Steven Noonan <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/evlist.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
tools/perf/util/evlist.c +19 -1
@@ -1624,7 +1624,7 @@ size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)return printed +fprintf (fp,"\n" ); } -int perf_evlist__strerror_open (struct perf_evlist *evlist__maybe_unused , +int perf_evlist__strerror_open (struct perf_evlist *evlist,int err,char *buf,size_t size) {int printed, value;
@@ -1652,7 +1652,25 @@ int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused,"Hint:\tTry: 'sudo sh -c \"echo -1 > /proc/sys/kernel/perf_event_paranoid\"'\n" "Hint:\tThe current value is %d.", value);break ; +case EINVAL : { +struct perf_evsel *first =perf_evlist__first (evlist); +int max_freq; + +if (sysctl__read_int ("kernel/perf_event_max_sample_rate" , &max_freq) <0 ) + goto out_default; + +if (first->attr.sample_freq < (u64 )max_freq) + goto out_default; + + printed =scnprintf (buf, size, +"Error:\t%s.\n" +"Hint:\tCheck /proc/sys/kernel/perf_event_max_sample_rate.\n" +"Hint:\tThe current value is %d and %" PRIu64" is being requested." , + emsg, max_freq, first->attr.sample_freq); +break ; + }default : +out_default:scnprintf (buf, size,"%s" , emsg);break ; }