提交 0a102479 编写于 作者: F Frederic Weisbecker

perf: Set filters before mmaping events

We currently set the filters after we mmap the events, this is a
race that let undesired events record themselves in the buffer before
we had the time to set the filters.

So set the filters before they can be recorded. That also librarizes
the filters setting so that filtering can be done more easily
from other tools than perf record later.
Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
上级 5807806a
...@@ -180,12 +180,10 @@ static struct perf_header_attr *get_header_attr(struct perf_event_attr *a, int n ...@@ -180,12 +180,10 @@ static struct perf_header_attr *get_header_attr(struct perf_event_attr *a, int n
static void create_counter(struct perf_evsel *evsel, int cpu) static void create_counter(struct perf_evsel *evsel, int cpu)
{ {
char *filter = evsel->filter;
struct perf_event_attr *attr = &evsel->attr; struct perf_event_attr *attr = &evsel->attr;
struct perf_header_attr *h_attr; struct perf_header_attr *h_attr;
struct perf_sample_id *sid; struct perf_sample_id *sid;
int thread_index; int thread_index;
int ret;
for (thread_index = 0; thread_index < evsel_list->threads->nr; thread_index++) { for (thread_index = 0; thread_index < evsel_list->threads->nr; thread_index++) {
h_attr = get_header_attr(attr, evsel->idx); h_attr = get_header_attr(attr, evsel->idx);
...@@ -204,16 +202,6 @@ static void create_counter(struct perf_evsel *evsel, int cpu) ...@@ -204,16 +202,6 @@ static void create_counter(struct perf_evsel *evsel, int cpu)
pr_warning("Not enough memory to add id\n"); pr_warning("Not enough memory to add id\n");
exit(-1); exit(-1);
} }
if (filter != NULL) {
ret = ioctl(FD(evsel, cpu, thread_index),
PERF_EVENT_IOC_SET_FILTER, filter);
if (ret) {
error("failed to set filter with %d (%s)\n", errno,
strerror(errno));
exit(-1);
}
}
} }
if (!sample_type) if (!sample_type)
...@@ -367,6 +355,12 @@ static void open_counters(struct perf_evlist *evlist) ...@@ -367,6 +355,12 @@ static void open_counters(struct perf_evlist *evlist)
} }
} }
if (perf_evlist__set_filters(evlist)) {
error("failed to set filter with %d (%s)\n", errno,
strerror(errno));
exit(-1);
}
if (perf_evlist__mmap(evlist, mmap_pages, false) < 0) if (perf_evlist__mmap(evlist, mmap_pages, false) < 0)
die("failed to mmap with %d (%s)\n", errno, strerror(errno)); die("failed to mmap with %d (%s)\n", errno, strerror(errno));
......
...@@ -348,3 +348,31 @@ void perf_evlist__delete_maps(struct perf_evlist *evlist) ...@@ -348,3 +348,31 @@ void perf_evlist__delete_maps(struct perf_evlist *evlist)
evlist->cpus = NULL; evlist->cpus = NULL;
evlist->threads = NULL; evlist->threads = NULL;
} }
int perf_evlist__set_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;
list_for_each_entry(evsel, &evlist->entries, node) {
filter = evsel->filter;
if (!filter)
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;
}
}
}
return 0;
}
...@@ -60,5 +60,6 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist, ...@@ -60,5 +60,6 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist,
int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid, int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid,
pid_t target_tid, const char *cpu_list); pid_t target_tid, const char *cpu_list);
void perf_evlist__delete_maps(struct perf_evlist *evlist); void perf_evlist__delete_maps(struct perf_evlist *evlist);
int perf_evlist__set_filters(struct perf_evlist *evlist);
#endif /* __PERF_EVLIST_H */ #endif /* __PERF_EVLIST_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册