perf evsel: Introduce method to request IDs be used
authorArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 10 Dec 2012 18:21:30 +0000 (15:21 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 10 Dec 2012 18:21:30 +0000 (15:21 -0300)
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>
tools/perf/builtin-top.c
tools/perf/tests/mmap-basic.c
tools/perf/util/evsel.c
tools/perf/util/evsel.h

index 31a7c51aac7635476992fc01892d8a6719c847ce..a30647487ba394f2ddfeed226a845764dafb65b6 100644 (file)
@@ -910,10 +910,8 @@ static void perf_top__start_counters(struct perf_top *top)
                        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);
index 4743b6d7a09ad959b9dd90a10493e2023b4c7e4b..cdd50755af51d6155e1fcf875965ae5576fe70d1 100644 (file)
@@ -70,8 +70,7 @@ int test__basic_mmap(void)
                }
 
                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]);
 
index fc80f5a32fa60a7bd4ae366771ad8cb6b2cb018c..9dde7e933be94a44a2e9328cd379475db21b1aea 100644 (file)
@@ -68,6 +68,12 @@ void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel,
        }
 }
 
+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)
 {
index 7398539692439156e86a26f5e4025b1d318e2108..5c089775064f7f9ff69a43225334c26aa6b8a489 100644 (file)
@@ -129,6 +129,8 @@ void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel,
 #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);