aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2014-07-31 02:00:52 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-08-13 18:21:32 -0400
commit60b0896cc35243f515eda2085f9897e296177e45 (patch)
tree21db1aaecc43f11e1c0465e3ffb917a2731b6e05
parentbf8e8f4b832972c76d64ab2e2837a48397144887 (diff)
perf evlist: Add perf_evlist__set_tracking_event()
Add a function to change which event is used to track mmap, comm and task events. This is needed with Instruction Tracing because the Instruction Tracing event must come first but cannot be used for tracking because it will be disabled under some circumstances. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> 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/r/1406786474-9306-10-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/evlist.c17
-rw-r--r--tools/perf/util/evlist.h3
-rw-r--r--tools/perf/util/evsel.c3
-rw-r--r--tools/perf/util/evsel.h1
-rw-r--r--tools/perf/util/record.c2
5 files changed, 24 insertions, 2 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index c74d8ecc9c70..9d863db3f4b2 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -122,6 +122,7 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
122{ 122{
123 list_add_tail(&entry->node, &evlist->entries); 123 list_add_tail(&entry->node, &evlist->entries);
124 entry->idx = evlist->nr_entries; 124 entry->idx = evlist->nr_entries;
125 entry->tracking = !entry->idx;
125 126
126 if (!evlist->nr_entries++) 127 if (!evlist->nr_entries++)
127 perf_evlist__set_id_pos(evlist); 128 perf_evlist__set_id_pos(evlist);
@@ -1295,3 +1296,19 @@ void perf_evlist__to_front(struct perf_evlist *evlist,
1295 1296
1296 list_splice(&move, &evlist->entries); 1297 list_splice(&move, &evlist->entries);
1297} 1298}
1299
1300void perf_evlist__set_tracking_event(struct perf_evlist *evlist,
1301 struct perf_evsel *tracking_evsel)
1302{
1303 struct perf_evsel *evsel;
1304
1305 if (tracking_evsel->tracking)
1306 return;
1307
1308 evlist__for_each(evlist, evsel) {
1309 if (evsel != tracking_evsel)
1310 evsel->tracking = false;
1311 }
1312
1313 tracking_evsel->tracking = true;
1314}
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index f5173cd63693..e0084f90c271 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -262,4 +262,7 @@ void perf_evlist__to_front(struct perf_evlist *evlist,
262#define evlist__for_each_safe(evlist, tmp, evsel) \ 262#define evlist__for_each_safe(evlist, tmp, evsel) \
263 __evlist__for_each_safe(&(evlist)->entries, tmp, evsel) 263 __evlist__for_each_safe(&(evlist)->entries, tmp, evsel)
264 264
265void perf_evlist__set_tracking_event(struct perf_evlist *evlist,
266 struct perf_evsel *tracking_evsel);
267
265#endif /* __PERF_EVLIST_H */ 268#endif /* __PERF_EVLIST_H */
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 66de9a708163..01ce14c3575e 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -162,6 +162,7 @@ void perf_evsel__init(struct perf_evsel *evsel,
162 struct perf_event_attr *attr, int idx) 162 struct perf_event_attr *attr, int idx)
163{ 163{
164 evsel->idx = idx; 164 evsel->idx = idx;
165 evsel->tracking = !idx;
165 evsel->attr = *attr; 166 evsel->attr = *attr;
166 evsel->leader = evsel; 167 evsel->leader = evsel;
167 evsel->unit = ""; 168 evsel->unit = "";
@@ -561,7 +562,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)
561{ 562{
562 struct perf_evsel *leader = evsel->leader; 563 struct perf_evsel *leader = evsel->leader;
563 struct perf_event_attr *attr = &evsel->attr; 564 struct perf_event_attr *attr = &evsel->attr;
564 int track = !evsel->idx; /* only the first counter needs these */ 565 int track = evsel->tracking;
565 bool per_cpu = opts->target.default_per_cpu && !opts->target.per_thread; 566 bool per_cpu = opts->target.default_per_cpu && !opts->target.per_thread;
566 567
567 attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1; 568 attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1;
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index dbb2a0d20907..7bc314be6a7b 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -86,6 +86,7 @@ struct perf_evsel {
86 bool no_aux_samples; 86 bool no_aux_samples;
87 bool immediate; 87 bool immediate;
88 bool system_wide; 88 bool system_wide;
89 bool tracking;
89 /* parse modifier helper */ 90 /* parse modifier helper */
90 int exclude_GH; 91 int exclude_GH;
91 int nr_members; 92 int nr_members;
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
index e778afda0fb9..cf69325b985f 100644
--- a/tools/perf/util/record.c
+++ b/tools/perf/util/record.c
@@ -115,7 +115,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts)
115 115
116 evlist__for_each(evlist, evsel) { 116 evlist__for_each(evlist, evsel) {
117 perf_evsel__config(evsel, opts); 117 perf_evsel__config(evsel, opts);
118 if (!evsel->idx && use_comm_exec) 118 if (evsel->tracking && use_comm_exec)
119 evsel->attr.comm_exec = 1; 119 evsel->attr.comm_exec = 1;
120 } 120 }
121 121