perf parser: Improve error message for PMU address filters
This is the second version of a patch that improves the error message of the perf events parser when the PMU hardware does not support address filters. Previously, the perf returned the following error: $ perf record -e intel_pt// --filter 'filter sys_write' --filter option should follow a -e tracepoint or HW tracer option This implies there is some syntax error present in the command line, which is not true. Rather, notify the user that the CPU does not have support for this feature. For example, Intel chips based on the Broadwell micro-archticture have the Intel PT PMU, but do not support address filtering. Now, perf prints the following error message: $ perf record -e intel_pt// --filter 'filter sys_write' This CPU does not support address filtering Signed-off-by: Jack Henschel <jackdev@mailbox.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20180704121345.19025-1-jackdev@mailbox.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
da15fc2fa9
commit
49836f7811
1 changed files with 10 additions and 10 deletions
|
@ -1991,8 +1991,11 @@ static int set_filter(struct perf_evsel *evsel, const void *arg)
|
|||
int nr_addr_filters = 0;
|
||||
struct perf_pmu *pmu = NULL;
|
||||
|
||||
if (evsel == NULL)
|
||||
goto err;
|
||||
if (evsel == NULL) {
|
||||
fprintf(stderr,
|
||||
"--filter option should follow a -e tracepoint or HW tracer option\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (evsel->attr.type == PERF_TYPE_TRACEPOINT) {
|
||||
if (perf_evsel__append_tp_filter(evsel, str) < 0) {
|
||||
|
@ -2014,8 +2017,11 @@ static int set_filter(struct perf_evsel *evsel, const void *arg)
|
|||
perf_pmu__scan_file(pmu, "nr_addr_filters",
|
||||
"%d", &nr_addr_filters);
|
||||
|
||||
if (!nr_addr_filters)
|
||||
goto err;
|
||||
if (!nr_addr_filters) {
|
||||
fprintf(stderr,
|
||||
"This CPU does not support address filtering\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (perf_evsel__append_addr_filter(evsel, str) < 0) {
|
||||
fprintf(stderr,
|
||||
|
@ -2024,12 +2030,6 @@ static int set_filter(struct perf_evsel *evsel, const void *arg)
|
|||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
fprintf(stderr,
|
||||
"--filter option should follow a -e tracepoint or HW tracer option\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int parse_filter(const struct option *opt, const char *str,
|
||||
|
|
Loading…
Reference in a new issue