aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/evsel.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2012-10-10 11:39:03 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-08-07 16:35:22 -0400
commit3c1763115b492afb743daa4e1c8099eca6a70634 (patch)
treeca66a59ca4bc62f8e88dbcefa238405deede2d60 /tools/perf/util/evsel.c
parente4caec0d1af3d608d52e6b92d09fb862d7691d4b (diff)
perf tools: Add 'S' event/group modifier to read sample value
Adding 'S' event/group modifier to specify that the event value/s are read by PERF_SAMPLE_READ sample type processing, instead of the period value offered by lower layers. There's additional behaviour change for 'S' modifier being specified on event group: Currently all the events within a group makes samples. If user now specifies 'S' within group modifier, only the leader will trigger samples. The rest of events in the group will have sampling disabled. And same as for single events, values of all events within the group (including leader) are read by PERF_SAMPLE_READ sample type processing. Following example will create event group with cycles and cache-misses events, setting the cycles as group leader and the only event to actually sample. Both cycles and cache-misses event period values are read by PERF_SAMPLE_READ sample type processing with PERF_FORMAT_GROUP read format. Example: $ perf record -e '{cycles,cache-misses}:S' ls ... $ perf report --group --show-total-period --stdio ... # Samples: 36 of event 'anon group { cycles, cache-misses }' # Event count (approx.): 12585593 # # Overhead Period Command Shared Object Symbol # .............. .............. ....... ................. .......................... # 19.92% 1.20% 2505936 31 ls [kernel.kallsyms] [k] mark_held_locks 13.74% 0.47% 1729327 12 ls [kernel.kallsyms] [k] sched_clock_local 13.64% 23.72% 1716147 612 ls ld-2.14.90.so [.] check_match.10805 13.12% 23.22% 1650778 599 ls libc-2.14.90.so [.] _nl_intern_locale_data 11.24% 29.19% 1414554 753 ls [kernel.kallsyms] [k] sched_clock_cpu 8.50% 0.35% 1070150 9 ls [kernel.kallsyms] [k] check_chain_key ... Signed-off-by: Jiri Olsa <jolsa@redhat.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/n/tip-iyoinu3axi11mymwnh2b7fxj@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/evsel.c')
-rw-r--r--tools/perf/util/evsel.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 9ab8fff74e30..8f1016186d57 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -490,6 +490,7 @@ int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size)
490void perf_evsel__config(struct perf_evsel *evsel, 490void perf_evsel__config(struct perf_evsel *evsel,
491 struct perf_record_opts *opts) 491 struct perf_record_opts *opts)
492{ 492{
493 struct perf_evsel *leader = evsel->leader;
493 struct perf_event_attr *attr = &evsel->attr; 494 struct perf_event_attr *attr = &evsel->attr;
494 int track = !evsel->idx; /* only the first counter needs these */ 495 int track = !evsel->idx; /* only the first counter needs these */
495 496
@@ -499,6 +500,25 @@ void perf_evsel__config(struct perf_evsel *evsel,
499 perf_evsel__set_sample_bit(evsel, IP); 500 perf_evsel__set_sample_bit(evsel, IP);
500 perf_evsel__set_sample_bit(evsel, TID); 501 perf_evsel__set_sample_bit(evsel, TID);
501 502
503 if (evsel->sample_read) {
504 perf_evsel__set_sample_bit(evsel, READ);
505
506 /*
507 * We need ID even in case of single event, because
508 * PERF_SAMPLE_READ process ID specific data.
509 */
510 perf_evsel__set_sample_id(evsel);
511
512 /*
513 * Apply group format only if we belong to group
514 * with more than one members.
515 */
516 if (leader->nr_members > 1) {
517 attr->read_format |= PERF_FORMAT_GROUP;
518 attr->inherit = 0;
519 }
520 }
521
502 /* 522 /*
503 * We default some events to a 1 default interval. But keep 523 * We default some events to a 1 default interval. But keep
504 * it a weak assumption overridable by the user. 524 * it a weak assumption overridable by the user.
@@ -514,6 +534,15 @@ void perf_evsel__config(struct perf_evsel *evsel,
514 } 534 }
515 } 535 }
516 536
537 /*
538 * Disable sampling for all group members other
539 * than leader in case leader 'leads' the sampling.
540 */
541 if ((leader != evsel) && leader->sample_read) {
542 attr->sample_freq = 0;
543 attr->sample_period = 0;
544 }
545
517 if (opts->no_samples) 546 if (opts->no_samples)
518 attr->sample_freq = 0; 547 attr->sample_freq = 0;
519 548