int perf_evlist__apply_filters(struct perf_evlist *evlist)
 {
-       const struct thread_map *threads = evlist->threads;
-       const struct cpu_map *cpus = evlist->cpus;
        struct perf_evsel *evsel;
-       char *filter;
-       int thread;
-       int cpu;
-       int err;
-       int fd;
+       int err = 0;
+       const int ncpus = cpu_map__nr(evlist->cpus),
+                 nthreads = evlist->threads->nr;
 
        list_for_each_entry(evsel, &evlist->entries, node) {
-               filter = evsel->filter;
-               if (!filter)
+               if (evsel->filter == NULL)
                        continue;
-               for (cpu = 0; cpu < cpus->nr; cpu++) {
-                       for (thread = 0; thread < threads->nr; thread++) {
-                               fd = FD(evsel, cpu, thread);
-                               err = ioctl(fd, PERF_EVENT_IOC_SET_FILTER, filter);
-                               if (err)
-                                       return err;
-                       }
-               }
+
+               err = perf_evsel__set_filter(evsel, ncpus, nthreads, evsel->filter);
+               if (err)
+                       break;
        }
 
-       return 0;
+       return err;
+}
+
+int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter)
+{
+       struct perf_evsel *evsel;
+       int err = 0;
+       const int ncpus = cpu_map__nr(evlist->cpus),
+                 nthreads = evlist->threads->nr;
+
+       list_for_each_entry(evsel, &evlist->entries, node) {
+               err = perf_evsel__set_filter(evsel, ncpus, nthreads, filter);
+               if (err)
+                       break;
+       }
+
+       return err;
 }
 
 bool perf_evlist__valid_sample_type(struct perf_evlist *evlist)
 
 #define perf_evlist__set_tracepoints_handlers_array(evlist, array) \
        perf_evlist__set_tracepoints_handlers(evlist, array, ARRAY_SIZE(array))
 
+int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter);
+
 struct perf_evsel *
 perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id);
 
 
        return evsel->fd != NULL ? 0 : -ENOMEM;
 }
 
+int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads,
+                          const char *filter)
+{
+       int cpu, thread;
+
+       for (cpu = 0; cpu < ncpus; cpu++) {
+               for (thread = 0; thread < nthreads; thread++) {
+                       int fd = FD(evsel, cpu, thread),
+                           err = ioctl(fd, PERF_EVENT_IOC_SET_FILTER, filter);
+
+                       if (err)
+                               return err;
+               }
+       }
+
+       return 0;
+}
+
 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads)
 {
        evsel->sample_id = xyarray__new(ncpus, nthreads, sizeof(struct perf_sample_id));
 
 void perf_evsel__free_id(struct perf_evsel *evsel);
 void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
 
+int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads,
+                          const char *filter);
+
 int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
                             struct cpu_map *cpus);
 int perf_evsel__open_per_thread(struct perf_evsel *evsel,