Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf evlist: Return the first evsel with an invalid filter in apply_filters()

Use of a bad filter currently generates the message:
Error: failed to set filter with 22 (Invalid argument)

Add the event name to make it clear to which event the filter
failed to apply:
Error: Failed to set filter "foo" on event sched:sg_lb_stats: 22: Invalid argument

To test it use something like:

# perf record -e sched:sched_switch -e sched:*fork --filter parent_pid==1 -e sched:*wait* --filter bla usleep 1
Error: failed to set filter "bla" on event sched:sched_stat_iowait with 22 (Invalid argument)
#

Based-on-a-patch-by: David Ahern <dsahern@gmail.com>
Acked-by: David Ahern <dsahern@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-d7gq2fjvaecozp9o2i0siifu@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

+11 -7
+3 -2
tools/perf/builtin-record.c
··· 161 161 } 162 162 } 163 163 164 - if (perf_evlist__apply_filters(evlist)) { 165 - error("failed to set filter with %d (%s)\n", errno, 164 + if (perf_evlist__apply_filters(evlist, &pos)) { 165 + error("failed to set filter \"%s\" on event %s with %d (%s)\n", 166 + pos->filter, perf_evsel__name(pos), errno, 166 167 strerror_r(errno, msg, sizeof(msg))); 167 168 rc = -1; 168 169 goto out;
+3 -2
tools/perf/builtin-stat.c
··· 684 684 unit_width = l; 685 685 } 686 686 687 - if (perf_evlist__apply_filters(evsel_list)) { 688 - error("failed to set filter with %d (%s)\n", errno, 687 + if (perf_evlist__apply_filters(evsel_list, &counter)) { 688 + error("failed to set filter \"%s\" on event %s with %d (%s)\n", 689 + counter->filter, perf_evsel__name(counter), errno, 689 690 strerror_r(errno, msg, sizeof(msg))); 690 691 return -1; 691 692 }
+4 -2
tools/perf/util/evlist.c
··· 1050 1050 return -1; 1051 1051 } 1052 1052 1053 - int perf_evlist__apply_filters(struct perf_evlist *evlist) 1053 + int perf_evlist__apply_filters(struct perf_evlist *evlist, struct perf_evsel **err_evsel) 1054 1054 { 1055 1055 struct perf_evsel *evsel; 1056 1056 int err = 0; ··· 1062 1062 continue; 1063 1063 1064 1064 err = perf_evsel__set_filter(evsel, ncpus, nthreads, evsel->filter); 1065 - if (err) 1065 + if (err) { 1066 + *err_evsel = evsel; 1066 1067 break; 1068 + } 1067 1069 } 1068 1070 1069 1071 return err;
+1 -1
tools/perf/util/evlist.h
··· 152 152 } 153 153 154 154 int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target); 155 - int perf_evlist__apply_filters(struct perf_evlist *evlist); 155 + int perf_evlist__apply_filters(struct perf_evlist *evlist, struct perf_evsel **err_evsel); 156 156 157 157 void __perf_evlist__set_leader(struct list_head *list); 158 158 void perf_evlist__set_leader(struct perf_evlist *evlist);