aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-record.c
diff options
context:
space:
mode:
authorTom Zanussi <tzanussi@gmail.com>2010-05-03 01:14:48 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2010-05-03 09:31:48 -0400
commit63e0c7715aab6085faa487d498889f4361dc6542 (patch)
tree3d6923589ed744abeca4e3bb1a6fa512e6e3952b /tools/perf/builtin-record.c
parent090f7204dfdb5d7f18208ea81dfdba845897cedd (diff)
perf: record TRACE_INFO only if using tracepoints and SAMPLE_RAW
The current perf code implicitly assumes SAMPLE_RAW means tracepoints are being used, but doesn't check for that. It happily records the TRACE_INFO even if SAMPLE_RAW is used without tracepoints, but when the perf data is read it won't go any further when it finds TRACE_INFO but no tracepoints, and displays misleading errors. This adds a check for both in perf-record, and won't record TRACE_INFO unless both are true. This at least allows perf report -D to dump raw events, and avoids triggering a misleading error condition in perf trace. It doesn't actually enable the non-tracepoint raw events to be displayed in perf trace, since perf trace currently only deals with tracepoint events. Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <1272865861.7932.16.camel@tropicana> Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r--tools/perf/builtin-record.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index ac989e9ba8fe..0ff67d1c4752 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -560,11 +560,12 @@ static int __cmd_record(int argc, const char **argv)
560 return err; 560 return err;
561 } 561 }
562 562
563 if (raw_samples) { 563 if (raw_samples && have_tracepoints(attrs, nr_counters)) {
564 perf_header__set_feat(&session->header, HEADER_TRACE_INFO); 564 perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
565 } else { 565 } else {
566 for (i = 0; i < nr_counters; i++) { 566 for (i = 0; i < nr_counters; i++) {
567 if (attrs[i].sample_type & PERF_SAMPLE_RAW) { 567 if (attrs[i].sample_type & PERF_SAMPLE_RAW &&
568 attrs[i].type == PERF_TYPE_TRACEPOINT) {
568 perf_header__set_feat(&session->header, HEADER_TRACE_INFO); 569 perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
569 break; 570 break;
570 } 571 }
@@ -662,19 +663,25 @@ static int __cmd_record(int argc, const char **argv)
662 return err; 663 return err;
663 } 664 }
664 665
665 err = event__synthesize_tracing_data(output, attrs, 666 if (have_tracepoints(attrs, nr_counters)) {
666 nr_counters, 667 /*
667 process_synthesized_event, 668 * FIXME err <= 0 here actually means that
668 session); 669 * there were no tracepoints so its not really
669 /* 670 * an error, just that we don't need to
670 * FIXME err <= 0 here actually means that there were no tracepoints 671 * synthesize anything. We really have to
671 * so its not really an error, just that we don't need to synthesize 672 * return this more properly and also
672 * anything. 673 * propagate errors that now are calling die()
673 * We really have to return this more properly and also propagate 674 */
674 * errors that now are calling die() 675 err = event__synthesize_tracing_data(output, attrs,
675 */ 676 nr_counters,
676 if (err > 0) 677 process_synthesized_event,
678 session);
679 if (err <= 0) {
680 pr_err("Couldn't record tracing data.\n");
681 return err;
682 }
677 advance_output(err); 683 advance_output(err);
684 }
678 } 685 }
679 686
680 machine = perf_session__find_host_machine(session); 687 machine = perf_session__find_host_machine(session);