When mmaping multiple events we need to find the right evsel that
matches an event in the ring buffer.
For that we need to set the PERF_FORMAT_ID bit in
perf_event_attr.read_format so that when we read the event fds we get
that id to then hash it and be able later to use perf_evlist__id2evsel
to find the right evsel.
We also need to set the PERF_SAMPLE_ID bit in
perf_event_attr.sample_type to ask for that id to be stashed in each
sample, so that we can demux it.
So add a perf_evsel__set_sample_id() method to do those two things in
one operation.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-1z4xcmbud30lamklfe80oopu@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
attr->sample_freq = top->freq;
}
- if (evlist->nr_entries > 1) {
- perf_evsel__set_sample_bit(counter, ID);
- attr->read_format |= PERF_FORMAT_ID;
- }
+ if (evlist->nr_entries > 1)
+ perf_evsel__set_sample_id(counter);
if (perf_target__has_cpu(&top->target))
perf_evsel__set_sample_bit(counter, CPU);
}
evsels[i]->attr.wakeup_events = 1;
- evsels[i]->attr.read_format |= PERF_FORMAT_ID;
- perf_evsel__set_sample_bit(evsels[i], ID);
+ perf_evsel__set_sample_id(evsels[i]);
perf_evlist__add(evlist, evsels[i]);
}
}
+void perf_evsel__set_sample_id(struct perf_evsel *evsel)
+{
+ perf_evsel__set_sample_bit(evsel, ID);
+ evsel->attr.read_format |= PERF_FORMAT_ID;
+}
+
void perf_evsel__init(struct perf_evsel *evsel,
struct perf_event_attr *attr, int idx)
{
#define perf_evsel__reset_sample_bit(evsel, bit) \
__perf_evsel__reset_sample_bit(evsel, PERF_SAMPLE_##bit)
+void perf_evsel__set_sample_id(struct perf_evsel *evsel);
+
int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads,
const char *filter);